来自使用SCHED_RR调度策略运行的线程的sched_yield()的影响

时间:2015-08-30 20:18:46

标签: c++ c multithreading

我在Linux下有一个由两个线程组成的进程,一个是生产者,一个是消费者。为简单起见,假设这是系统在单核,单CPU架构上运行的唯一进程。

首先创建生产者,并手动为SCHED_RR调度策略sched_setscheduler(0, SCHED_RR, &params)。一段时间后,也会创建消耗线程。在为生产者调用sched_setscheduler之后创建它时,它没有相同的SCHED_RR调度策略集。

在这种情况下,我试图理解生产者sched_yield()的影响(一旦产生一个元素)。

有两种可能性,但我不确定哪一种是真的:

  1. 消费者可能计划在生产者再次运行之前执行
  2. 消费者无法被安排执行,因为它没有使用SCHED_RR调度策略运行生产者未完成其指定的量子时间或没有sleep。在这种情况下yield()可能会产生负面影响,因为它没有任何要求。

1 个答案:

答案 0 :(得分:0)

虽然我不确定在实践中会发生什么,但正式sched_yield不允许在这种情况下运行优先级较低的线程;它仅用于屈服于同一优先级的线程。

您应该使用条件变量或其他一些适当的同步机制来确保您的消费者能够运行(生产者应该在队列高于某个充满度阈值或类似的谓词上pthread_cond_wait而不是尝试做睡眠/基于收益的调度。