18

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

#include <windows.h>

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

5 回答 5

28

相当于SetThreadPrioritylinux 中的pthread_setschedprio(pthread_t thread, int priority).

检查手册页

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

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

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

于 2012-06-04T05:46:58.360 回答
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;
}
于 2012-06-06T06:43:08.097 回答
7

pthread_setschedparam(3)正如其他各种答案所提到的,POSIX 标准包括。在谈到实时线程时,大多数情况下都会提到这个 POSIX 线程库函数,但 POSIX 标准并不仅仅将其使用限制在实时线程领域。然而,在 Linux 中,只有在使用实时调度类SCHED_FIFOSCHED_RR只有那些调度类允许优先级参数有多个值时,它的使用才真正有意义。请参阅此堆栈溢出答案以获取说明。

幸运或不幸的是,这是一个观点问题,似乎主流 Linux POSIX 线程库实现(过时的 LinuxThreads 和当前的 NPTL 实现)都不完全符合 POSIX,因为“好的价值”不是特定于进程而是特定于线程参数,因此您似乎可以使用它setpriority(3)来更改 Linux 中线程的好坏。此声明基于pthreads(7)手册页中的兼容性说明(在该页面中搜索“nice value”);我还没有在实践中实际测试过(直接做的事情)。

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

于 2014-01-13T08:09:35.233 回答
3

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

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

于 2012-06-04T05:05:18.803 回答
1

对于那些可能正在搜索基于 BSD 的 OS 解决方案(例如 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

于 2016-10-03T20:32:37.623 回答