我想以这种方式使用调度程序:
示例
如果带有99的pthread正在运行,则不允许运行其他pthread。 执行顺序应以优先级为导向
我的实施:
每个pthread都是使用该序列创建的
struct sched_param schedparam; // thread scheduler parameter
pthread_create(threadPtr,NULL,(void *)entryPt,NULL);
pthread_attr_setschedpolicy(attrPtr, SCHED_FIFO);
schedparam.__sched_priority=priority;
pthread_attr_setschedparam(attrPtr, &schedparam );
pthread_setschedparam(threadId,SCHED_FIFO,&schedparam );
但它不起作用。
行为:
pthreads的执行顺序与创建顺序相同。
答案 0 :(得分:1)
'pthreads的执行顺序与它们的创建顺序相同':如果你有三个或更多的可用内核,那么这就是预期的行为 - 所有线程都有不同的优先级,但是有足够的资源来运行它们,所以他们都跑了。
即使你只有一个核心,许多操作系统调度程序都有反饥饿算法,逐渐提高低优先级线程的动态优先级,以便它们最终能够运行(一点点)。如果低优先级线程已获得锁定,此方案可以帮助重载框,然后被抢占然后无法继续,导致其他地方出现问题(优先级倒置)。
如果你想要发布这样的'奇怪'行为,你必须使用合适的内部线程通信对其进行编码,以防止其他线程在重要线程运行时运行。
编辑:
'pthreads按照创建顺序执行' - 你怎么知道这个?线程做什么?他们会永远奔跑吗?
答案 1 :(得分:1)
假设你的线程没有被I / O阻塞或收益(请显示代码),这可能是由于:
sysctl
设置限制每个线程可用的时间量,例如: