C强制线程在pthread_create之后立即启动。 pthread_creield之后的pthread_yield?

时间:2016-01-18 16:32:56

标签: c multithreading pthreads

我正在努力实现以下目标:

pthread_create()之后立即强制新创建的线程开始运行。没有使用实时调度。

来自pthread_create() man page

  

除非是实时调度策略          在调用pthread_create()后,它正在被使用          不确定哪个线程 - 调用者或新线程 - 接下来          执行。

当然这是有道理的。因此,我想通过使用pthread_yield()我将强制新创建的线程接管并因此开始。但事实并非如此。

我只能在pthread_create()之后通过睡眠获得所需的结果。但我不想依赖这个解决方案。

  1. 为什么我无法通过pthread_yield()实现我的目标?
  2. 除了使用睡眠之外还有其他方法吗?
  3. 新线程的创建处理方式与任务切换相同,即遵循调度策略?例如,在RT(抢占式)调度中,如果新创建的线程具有更高的优先级,它是否会立即抢占当前线程?
  4. 相关文章:

    谢谢!

1 个答案:

答案 0 :(得分:0)

如果您使用的是多核系统,那么您的新线程可能会在与创建它的线程不同的核心上进行调度。调用pthread_yield()可能没有预期的效果,因为它可能只影响调用者核心的调度,而不影响任何其他核心。效果通常是将线程放在可运行队列的末尾。 (值得注意的是pthread_yield()不是标准系统调用,因此没有关于其预期行为的标准参考。)

如果睡眠时间非零,则调用sleep()可能会产生不同的结果。该线程实际上放在一个定时器唤醒队列中,并且必须在定时器到期后移回可运行队列。这将使创建线程唤醒之前更有可能在不同核心上运行新线程。

如果新线程的优先级高于创建它的线程,它将抢占创建线程。

根据评论中的建议,可以通过使创建线程有条件地等待来自新创建的线程的信号来实现可预测的行为。