【问题标题】:C force the thread to start immediately after pthread_create. pthread_yield after pthread_create?C 强制线程在 pthread_create 之后立即启动。 pthread_create 之后的 pthread_yield?
【发布时间】:2016-01-18 16:32:55
【问题描述】:

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

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

来自pthread_create() man page

除非实时调度策略 正在使用,在调用 pthread_create() 之后,它是 不确定下一个线程(调用者还是新线程) 执行。

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

我只有在pthread_create() 之后睡觉才能达到预期的效果。但我不想依赖这个解决方案。

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

相关帖子:

谢谢!

【问题讨论】:

  • pthread_create()之后使用条件并阻塞,直到新线程向创建者线程发出信号。
  • ^^ 应该是一个答案 - 这是一个明显且正确的解决方案:)
  • 代码中的哪个线程正在调用 pthread_yield()? pthread_yield() 通知操作系统您的线程已完成工作,并且可以将执行切换到另一个线程。
  • @iharab 是的,这可能是另一种解决方案。谢谢!但我也试图理解为什么pthread_yield() 方法对我不起作用。 @terence 正在调用 pthread_create() 的线程也在调用 pthread_yield()
  • 您可以尝试设置亲和力并在特定内核上运行您的进程以查看 pthread_yield() 是否有效,例如参见此处xmodulo.com/run-program-process-specific-cpu-cores-linux.html

标签: c multithreading pthreads


【解决方案1】:

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

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

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

按照 cmets 的建议,可以通过使创建线程有条件地等待来自新创建线程的信号来实现可预测的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2016-07-08
    • 2014-05-27
    • 2014-04-24
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多