C强制线程在pthread_创建后立即启动。pthread_创建后的pthread_产量?
我正在努力实现以下目标: 强制新创建的线程在C强制线程在pthread_创建后立即启动。pthread_创建后的pthread_产量?,c,multithreading,pthreads,C,Multithreading,Pthreads,我正在努力实现以下目标: 强制新创建的线程在pthread\u create()之后立即开始运行。没有使用实时调度 从: 除非是实时调度策略 正在使用,在调用pthread_create()后 不确定调用方或新线程下一个将使用哪个线程 执行 这当然有道理。因此,我认为通过使用pthread\u yield()我将强制新创建的线程接管并作为启动的结果。但事实并非如此 我只能在pthread\u create()之后睡觉,才能达到预期的效果。但我不想依赖这个atm解决方案 为什么我不能用pthrea
pthread\u create()
之后立即开始运行。没有使用实时调度
从:
除非是实时调度策略
正在使用,在调用pthread_create()后
不确定调用方或新线程下一个将使用哪个线程
执行
这当然有道理。因此,我认为通过使用pthread\u yield()
我将强制新创建的线程接管并作为启动的结果。但事实并非如此
我只能在pthread\u create()
之后睡觉,才能达到预期的效果。但我不想依赖这个atm解决方案
pthread\u yield()
实现我的目标谢谢 如果您在多核系统上,那么您的新线程可能调度在与创建它的线程不同的核心上。调用
pthread\u yield()
可能没有预期的效果,因为它可能只影响调用者核心上的调度,而不影响任何其他核心上的调度。其效果通常是将线程放在可运行队列的末尾。(同样值得注意的是,pthread_yield()
不是标准的系统调用,因此没有关于其预期行为的标准参考。)
如果睡眠时间不为零,则调用sleep()
可能会产生不同的结果。该线程实际上被放置在计时器唤醒队列中,并且必须在计时器过期后移回可运行队列。这将使得在创建线程唤醒之前,更可能在另一个核心上运行一个新线程
如果新线程的优先级高于创建它的线程,它将抢占创建线程
正如注释中所建议的,通过使创建线程有条件地等待来自新创建线程的信号,可以实现可预测的行为。如果您在多核系统上,则新线程可能调度在与创建它的线程不同的核上。调用
pthread\u yield()
可能没有预期的效果,因为它可能只影响调用者核心上的调度,而不影响任何其他核心上的调度。其效果通常是将线程放在可运行队列的末尾。(同样值得注意的是,pthread_yield()
不是标准的系统调用,因此没有关于其预期行为的标准参考。)
如果睡眠时间不为零,则调用sleep()
可能会产生不同的结果。该线程实际上被放置在计时器唤醒队列中,并且必须在计时器过期后移回可运行队列。这将使得在创建线程唤醒之前,更可能在另一个核心上运行一个新线程
如果新线程的优先级高于创建它的线程,它将抢占创建线程
按照注释中的建议,通过使创建线程有条件地等待来自新创建线程的信号,可以实现可预测的行为。在
pthread_create()之后使用条件和块
直到新线程向创建者线程发出信号。^^应该是一个答案-这是一个明显而正确的解决方案:)代码中的哪个线程正在调用pthread_yield()?pthread_yield()通知操作系统您的线程已完成工作,并且可以将执行切换到另一个线程。@iharab是的,这可能是另一个解决方案。谢谢!但我也试图理解为什么pthread\u yield()
方法对我不起作用@特伦斯调用pthread\u create()
的线程也在调用pthread\u yield()
。您可以尝试设置关联性并在特定的内核上运行进程,以查看pthread\u yield()是否有效,例如,请参见此处在pthread\u create()之后使用条件和块
直到新线程向创建者线程发出信号。^^应该是一个答案-这是一个明显而正确的解决方案:)代码中的哪个线程正在调用pthread_yield()?pthread_yield()通知操作系统您的线程已完成工作,并且可以将执行切换到另一个线程。@iharab是的,这可能是另一个解决方案。谢谢!但我也试图理解为什么pthread\u yield()
方法对我不起作用@特伦斯调用pthread\u create()
的线程也在调用pthread\u yield()
。您可以尝试设置关联并在特定的内核上运行进程,以查看pthread\u yield()是否有效,请参见此处的示例