Linux上的SetThreadPriority等价物(pthreads)

时间:2012-06-04 04:32:34

标签: c++ c linux winapi pthreads

鉴于以下代码,我想知道在假设pthreads甚至使用Boost.Thread API的情况下,linux中的等效代码是什么。

#include <windows.h>

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

5 个答案:

答案 0 :(得分:24)

linux中的SetThreadPriority等价物为pthread_setschedprio(pthread_t thread, int priority)

检查man page

编辑:这里是等效的示例代码:

#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。

编辑:必须在使用前初始化线程属性。

答案 1 :(得分:18)

你想:

#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;
}

答案 2 :(得分:6)

POSIX标准包括pthread_setschedparam(3),正如各种其他答案所述。在讨论实时线程时,大多数情况下会提到这个POSIX线程库函数,但POSIX标准并不仅限于将其用于实时线程的域。但是,在Linux中,如果使用实时调度类SCHED_FIFOSCHED_RR,它的使用才真正有意义,因为只有那些调度类允许优先级参数有多个值。有关说明,请参阅此stack overflow answer

幸运或不幸的是,这是一个透视问题,似乎主流Linux POSIX线程库实现(过时的LinuxThreads和当前的NPTL实现)不完全符合POSIX,因为“好的值”不是特定于流程的但是特定于线程的参数,所以看起来你可以使用setpriority(3)来改变Linux中线程的优点。此声明基于pthreads(7)手册页中的兼容性说明(在该页中搜索“nice value”);我实际上没有在实践中测试过(直截了当的事情)。

如果您决定使用POSIX不合规方式更改线程的好处,请注意,有人决定修复上述不合规的潜在可能性,在这种情况下似乎无法更改线程优先级在Linux中如果使用正常的调度类(SCHED_OTHER)。

答案 3 :(得分:3)

类似于pthread_setschedparam()以及政策和优先级的组合。

我猜您会使用策略SCHED_FIFO, SCHED_RR,您可以在其中指定线程的优先级。

答案 4 :(得分:1)

对于那些可能正在搜索基于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