Подтвердить что ты не робот

Эквивалент SetThreadPriority в Linux (pthreads)

Учитывая следующий бит кода, мне было интересно узнать, что эквивалентный бит кода будет в Linux, предполагая pthreads или даже используя Boost.Thread API.

#include <windows.h>

int main()
{
   SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
   return 0;
}
4b9b3361

Ответ 1

Эквивалент SetThreadPriority в linux будет pthread_setschedprio(pthread_t thread, int priority).

Проверьте справочную страницу.

EDIT: здесь пример кода эквивалентен:

#include <pthread.h>

int main()
{
    pthread_t thId = pthread_self();
    pthread_attr_t thAttr;
    int policy = 0;
    int max_prio_for_policy = 0;

    pthread_attr_init(&thAttr);
    pthread_attr_getschedpolicy(&thAttr, &policy);
    max_prio_for_policy = sched_get_priority_max(policy);


    pthread_setschedprio(thId, max_prio_for_policy);
    pthread_attr_destroy(&thAttr);

    return 0;
}

Этот пример предназначен для политики планирования по умолчанию, которая является SCHED_OTHER.

EDIT: атрибут thread должен быть инициализирован перед использованием.

Ответ 2

Вы хотите:

#include <pthread.h>

int main()
{
    int policy;
    struct sched_param param;

    pthread_getschedparam(pthread_self(), &policy, &param);
    param.sched_priority = sched_get_priority_max(policy);
    pthread_setschedparam(pthread_self(), policy, &param);

    return 0;
}

Ответ 3

Стандарт POSIX включает pthread_setschedparam(3), как упоминалось в других ответах. В основном эта функция библиотеки потоков POSIX упоминается при обсуждении потоков в реальном времени, но стандарт POSIX не ограничивает ее использование исключительно для домена потоков реального времени. Однако в Linux его использование имеет смысл только при использовании классов планирования реального времени SCHED_FIFO или SCHED_RR, поскольку только те классы планирования допускают более одного значения для параметра приоритета. См. Этот ответ на переполнение стека для иллюстрации.

К счастью или, к сожалению, это вопрос перспективы, кажется, что реализация потоков потоковой Linux Linux POSIX (устаревшие LinuxThreads и текущая реализация NPTL) не полностью совместимы с POSIX, поскольку "хорошее значение" не зависит от процесса но конкретный параметр потока, поэтому, возможно, вы можете использовать setpriority(3), чтобы изменить тонкость потока в Linux. Эта претензия основана на примечаниях о совместимости в справочной странице pthreads(7) (найдите "приятное значение" на этой странице); Я на самом деле не проверял на практике (прямое дело).

Если вы решите использовать несоответствующий способ POSIX для изменения нити, обратите внимание, что существует скрытая возможность того, что кто-то решает устранить указанное несоответствие, и в этом случае, похоже, нет способа изменить приоритет потока в Linux, если используется обычный класс планирования (SCHED_OTHER).

Ответ 4

Что-то вроде pthread_setschedparam() и сочетание политики и приоритета.

Думаю, вы использовали бы политики SCHED_FIFO, SCHED_RR, где вы можете указать приоритет потока.

Ответ 5

Для тех, кто может искать решения на базе ОС на базе BSD, такие как MacOS или iOS, вы можете захотеть установить приоритет потока с использованием mach вместо эквивалента POSIX, если это необходимо.

#include <mach/mach_init.h>
#include <mach/thread_policy.h>
#include <mach/sched.h>
#include <pthread.h>

int set_realtime(int period, int computation, int constraint) {
    struct thread_time_constraint_policy ttcpolicy;
    int ret;
    thread_port_t threadport = pthread_mach_thread_np(pthread_self());

    ttcpolicy.period=period; // HZ/160
    ttcpolicy.computation=computation; // HZ/3300;
    ttcpolicy.constraint=constraint; // HZ/2200;
    ttcpolicy.preemptible=1;

    if ((ret=thread_policy_set(threadport,
        THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t)&ttcpolicy,
        THREAD_TIME_CONSTRAINT_POLICY_COUNT)) != KERN_SUCCESS) {
            fprintf(stderr, "set_realtime() failed.\n");
            return 0;
    }
    return 1;
}

Источник: https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html