-1

我想以这种方式使用调度程序:

例子

  • 3 个具有不同优先级的 pthread ( 0 , 50 , 99 )

如果 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 );

但它不起作用。

行为:

pthread 的执行顺序与创建它们的顺序相同。

4

2 回答 2

1

假设您的线程在 I/O 或产量上没有被阻塞(请显示代码),这可能是由于:

  • 非超级用户线程不允许在优先级 19 以上运行
  • sysctl设置限制每个线程可用的时间量,例如:
    • kernel.sched_rt_period_us = 1000000
    • kernel.sched_rt_runtime_us = 950000,允许线程每秒只运行 95%。
于 2012-10-24T11:00:23.230 回答
1

'pthreads 的执行顺序与创建时的顺序相同':如果您有三个或更多空闲内核,那么这是预期的行为 - 所有线程都有不同的优先级,但有足够的资源来运行它们,所以它们都运行.

即使您只有一个内核,许多操作系统调度程序也具有抗饥饿算法,可以逐渐提高低优先级线程的动态优先级,以便它们最终可以运行(有点)。如果低优先级线程获得锁,然后被抢占然后无法继续,则此方案可以帮助重载的盒子,从而导致其他地方出现问题(优先级反转)。

如果您在发布时想要这种“奇怪”的行为,则必须使用合适的线程间通信对其进行实际编码,以防止其他线程在重要线程运行时运行。

编辑:

'pthreads 的执行顺序与它们创建的顺序相同' - 你怎么知道的?线程做什么?它们会永远运行吗?

于 2012-10-24T10:13:34.970 回答