Sli*_*ast 25 c++ linux boost posix pthreads
Boost Libraries似乎没有设置线程优先级的设备.这是在Linux上使用的最佳代码还是有更好的方法?
boost::thread myThread( MyFunction() );
struct sched_param param;
param.sched_priority = 90;
pthread_attr_setschedparam( myThread.native_handle(), SCHED_RR, ¶m);
Run Code Online (Sandbox Code Playgroud)
我没有很多Linux编程经验.
Duc*_*uck 24
这是我将如何做的基本模板,但在搜索后我发现旁边没有代码示例,所以我想判断结果是否是最好的.
问题是boost :: thread没有允许在创建线程时传入pthead属性的构造函数,因此您必须在线程启动后进行更改.我知道的另一种方法是通过进程/线程调度继承.除非另有说明,否则新线程将继承其创建者的计划/优先级,以便您可以在创建工作线程之前更改当前线程,然后根据需要进行更改.似乎很尴尬,但它是另一种选择.
这是一个希望能够证明两者的例子的黑客.您可能需要根据需要更改策略和优先级,并以root身份运行.
请注意设置优先级的方式.适用各种限制.
#include <iostream>
#include <boost/thread/thread.hpp>
#include <unistd.h>
#include <sched.h>
#include <cstdio>
void* threadfunc()
{
sleep(5);
}
void displayAndChange(boost::thread& daThread)
{
int retcode;
int policy;
pthread_t threadID = (pthread_t) daThread.native_handle();
struct sched_param param;
if ((retcode = pthread_getschedparam(threadID, &policy, ¶m)) != 0)
{
errno = retcode;
perror("pthread_getschedparam");
exit(EXIT_FAILURE);
}
std::cout << "INHERITED: ";
std::cout << "policy=" << ((policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
"???")
<< ", priority=" << param.sched_priority << std::endl;
policy = SCHED_FIFO;
param.sched_priority = 4;
if ((retcode = pthread_setschedparam(threadID, policy, ¶m)) != 0)
{
errno = retcode;
perror("pthread_setschedparam");
exit(EXIT_FAILURE);
}
std::cout << " CHANGED: ";
std::cout << "policy=" << ((policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
"???")
<< ", priority=" << param.sched_priority << std::endl;
}
int main(int argc, char* argv[])
{
int policy, res;
struct sched_param param;
if ((policy = sched_getscheduler(getpid())) == -1)
{
perror("sched_getscheduler");
exit(EXIT_FAILURE);
}
if ((res = sched_getparam(getpid(), ¶m)) == -1)
{
perror("sched_getparam");
exit(EXIT_FAILURE);
}
std::cout << " ORIGINAL: ";
std::cout << "policy=" << ((policy == SCHED_FIFO) ? "SCHED_FIFO" :
(policy == SCHED_RR) ? "SCHED_RR" :
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
"???")
<< ", priority=" << param.sched_priority << std::endl;
policy = SCHED_RR;
param.sched_priority = 2;
if ((res = sched_setscheduler(getpid(), policy, ¶m)) == -1)
{
perror("sched_setscheduler");
exit(EXIT_FAILURE);
}
boost::thread t1(&threadfunc);
displayAndChange(t1);
t1.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21016 次 |
| 最近记录: |