boost 线程 linux,在Linux中使用Boost设置线程优先级

本文探讨了如何在Boost库中创建线程时无法直接传递pthread属性,通过线程启动后改变其计划和优先级。作者提供了使用SCHED_FIFO和SCHED_RR策略实例,以及如何在创建工作线程前调整其调度参数。
摘要由CSDN通过智能技术生成

小编典典

那是我如何做的基本模板,但是在搜索之后,我发现几乎没有代码示例,因此我猜想是关于最佳还是无效的判断。

问题在于boost ::

thread没有允许在创建线程时传递pthead属性的构造函数,因此您必须在线程启动后进行更改。我知道解决该问题的唯一其他方法是通过进程/线程调度继承。除非另有指示,否则新线程将继承其创建者的计划/优先级,因此您可以在创建工作线程之前更改当前线程,然后根据需要更改。似乎很尴尬,但这是另一种选择。

这是一个希望能同时说明两者的示例。您可能需要适当地更改策略和优先级并以root用户身份运行。

设置优先级时要小心。有各种限制。

#include

#include

#include

#include

#include

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, &param)) != 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, &param)) != 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(), &param)) == -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, &param)) == -1)

{

perror("sched_setscheduler");

exit(EXIT_FAILURE);

}

boost::thread t1(&threadfunc);

displayAndChange(t1);

t1.join();

return 0;

}

2020-06-03

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值