我正在努力实现以下目标:
强制新创建的线程在 pthread_create()
之后立即开始运行。没有使用实时调度。
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。
- 为什么我不能使用
pthread_yield()
实现我的目标? - 除了使用 sleep 还有其他方法吗?
- 新线程的创建与任务切换的处理方式相同,即遵循调度策略?比如在RT(preemptive)调度中,如果新创建的线程有更高的优先级,是否会立即抢占当前线程?
相关文章:
- Does pthread_create starting thread?
- pthread_mutex not updating fast enough, so one thread "hogs" the lock.
谢谢!
最佳答案
如果您在多核系统上,那么您的新线程可能被安排在与创建它的线程不同的核心上。调用 pthread_yield()
可能不会产生预期的效果,因为它可能只会影响调用者核心的调度,而不影响任何其他核心。效果通常是将线程放在可运行队列的末尾。 (还值得注意的是,pthread_yield()
不是标准系统调用,因此没有关于其预期行为的标准引用。)
如果休眠时间不为零,调用 sleep()
可能会产生不同的结果。线程实际上是放在一个定时器唤醒队列中的,必须在定时器超时后移回可运行队列。这将更有可能在创建线程唤醒之前运行不同内核上的新线程。
如果一个新线程的优先级高于创建它的线程,它将抢占创建线程。
正如评论中所建议的那样,可以通过让创建线程有条件地等待来自新创建线程的信号来实现可预测的行为。
关于C 强制线程在 pthread_create 之后立即启动。 pthread_create 之后的 pthread_yield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34859627/