【发布时间】:2016-01-18 16:32:55
【问题描述】:
我正在努力实现以下目标:
强制新创建的线程在pthread_create() 之后立即开始运行。没有使用实时调度。
除非实时调度策略 正在使用,在调用 pthread_create() 之后,它是 不确定下一个线程(调用者还是新线程) 执行。
这当然是有道理的。因此,我想通过使用pthread_yield() 我将强制 新创建的线程接管并因此启动。但事实并非如此。
我只有在pthread_create() 之后睡觉才能达到预期的效果。但我不想依赖这个解决方案。
- 为什么我无法通过
pthread_yield()实现我的目标? - 除了使用睡眠还有其他方法吗?
- 新线程的创建与任务切换的处理方式相同,即遵循调度策略?比如在RT(抢占式)调度中,如果新创建的线程具有更高的优先级,是否会立即抢占当前线程?
相关帖子:
- Does pthread_create starting thread?
- pthread_mutex not updating fast enough, so one thread "hogs" the lock.
谢谢!
【问题讨论】:
-
在
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