使用pthread_create和SCHED_RR调度创建线程失败

时间:2016-12-28 03:28:45

标签: pthreads posix scheduling

我尝试编写一些内核用于使用SCHED_RR创建pthread:

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
struct sched_param params;
params.sched_priority = 10;
pthread_attr_setschedparam(&attr, &params);
pthread_create(&m_thread, &attr, &startThread, NULL);
pthread_attr_destroy(&attr);

但线程没有运行,我是否需要设置更多参数?

1 个答案:

答案 0 :(得分:0)

线程只能在没有SCHED_OTHER功能的情况下将日程安排设置为CAP_SYS_NICE。来自sched(7)

   In Linux kernels before 2.6.12, only privileged (CAP_SYS_NICE)
   threads can set a nonzero static priority (i.e., set a real-time
   scheduling policy).  The only change that an unprivileged thread can
   make is to set the SCHED_OTHER policy, and this can be done only if
   the effective user ID of the caller matches the real or effective
   user ID of the target thread (i.e., the thread specified by pid)
   whose policy is being changed.

这意味着当您使用SCHED_RR将调度策略设置为循环调度(pthread_attr_setschedpolicy())时,它很可能会失败(除非您为正在运行或正在运行的用户启用了此功能程序为sysadmin / root用户,可以覆盖CAP_SYS_NICE)。

您可以使用setcap程序设置功能:

$ sudo setcap cap_sys_nice=+ep ./a.out

(假设a.out是您的计划名称)。

如果你做错误检查,你已经弄明白了。您应该检查所有pthread函数(通常是所有库函数)的返回值是否失败。

由于您尚未发布完整代码,如果您没有加入您创建的主题,可能会出现问题(因为线程可能会退出之前m_thread已创建,退出整个过程)。所以,你可能想加入:

pthread_join(m_thread, NULL);

或者如果使用main()中的pthread_exit(NULL);不再需要主线程,则可以在不加入的情况下退出主线程。