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

标签 c multithreading pthreads

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

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

来自pthread_create() man page :

Unless real-time scheduling policies are being employed, after a call to pthread_create(), it is indeterminate which thread—the caller or the new thread—will next execute.

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

我只能在 pthread_create() 之后通过 sleep 来达到预期的结果。但我不想依赖这个解决方案 atm。

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

相关文章:

谢谢!

最佳答案

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

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

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

正如评论中所建议的那样,可以通过让创建线程有条件地等待来自新创建线程的信号来实现可预测的行为。

关于C 强制线程在 pthread_create 之后立即启动。 pthread_create 之后的 pthread_yield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34859627/

相关文章:

c - execl 不要离开子进程

c - 有和没有 "-ggdb1"选项的 gcc 调试信息有什么区别?

C++/Winforms 线程 : I get a build error with _beginthread

c++ - 为什么 pthread 条件变量被挂起?

c - 多线程程序计算总和在笔记本电脑上比台式机运行得更快

c - 等待几个线程之一完成?

c - 如何向左旋转位并向右添加旋转位

c - 如何在C中生成高斯 channel ?

Python:从另一个线程更改变量值

c - omp ordered 和 omp critical 之间的区别