sched_yield的行为

Met*_*est 11 multithreading yield scheduler linux-kernel

我对该sched_yield函数几乎没有任何疑问,因为我发现它在我的代码中没有按预期运行.很多时候,当我尝试通过调用产生它时,我看到同一个线程一次又一次地运行,即使存在其他线程sched_yield.

此外,如果我有多sched_yield核,将为所有核心上运行的线程或仅一个核心运行.例如,我在核心1上运行线程1,2和3,在核心2上运行线程4,5和6,并且sched_yield从线程2调用If ,它将仅由线程1和3替换,或者1,3,4 ,5和6都可能吗?我问这个是因为.Net Thread.Yield只会产生在同一个核心/处理器上运行的线程.

osg*_*sgx 6

http://www.kernel.org/doc/man-pages/online/pages/man2/sched_yield.2.html

sched_yield() 导致调用线程放弃 CPU。该线程因其静态优先级而被移至队列末尾,并且新线程开始运行。

如果调用线程是当时最高优先级列表中的唯一线程,则在调用 sched_yield() 后它将继续运行。

sched_yield 不是 .Net 调用,线程/进程模型与之不同。Windows/.NET的调度器与Linux的调度器不一样。Linux 甚至有几种可能的调度程序。

因此,您对 sched_yield 的期望是错误的。

如果你想控制线程如何运行,你可以将每个线程绑定到CPU。然后,线程将仅在绑定的 CPU 上运行。如果您有多个线程绑定到同一个 CPU,则使用 sched_yield可以切换到绑定到当前 CPU 并准备运行的另一个线程。

此外,如果每个线程想要执行大量 CPU 密集型工作,那么每个 CPU 使用多个线程也可能不是个好主意。

如果您想完全控制线程的运行方式,可以使用实时线程。http://www.linuxjournal.com/magazine/real-time-linux-kernel-scheduler - SCHED_FIFO 和 SCHED_RR RT 策略。