【发布时间】:2011-09-15 11:18:36
【问题描述】:
我对@987654321@ 函数没有几个问题,因为我发现它没有按照我的代码中的预期运行。很多时候,当我尝试通过调用sched_yield 来让出它时,即使存在其他线程,我也会看到同一个线程一次又一次地运行。
另外,如果我有多核,sched_yield 是否会为在所有内核或仅一个内核上运行的线程产生收益。例如,我在核心 1 上运行线程 1、2 和 3,在核心 2 上运行线程 4、5 和 6,如果从线程 2 调用 sched_yield,它将仅被线程 1 和 3 或 1 替换, 3、4、5、6都可以吗?我问这个是因为在 .Net Thread.Yield 中只让步于在同一核心/处理器上运行的线程。
【问题讨论】:
-
你打算如何运作? TBH,我真的不明白为什么这个调用有用,无论是在 POSIX/***X、Windows 还是任何抢占式多任务程序上。如果你让出你的线程,你不能保证操作系统不会立即再次加载它,如果其他线程当时还没有准备好,也许在同一个核心上。如果 .NET 版本具有处理器亲和性,(是的,我用 Google 搜索过它似乎有),那就更奇怪了——我猜它可能会提高纤维的性能?
-
@MartinJames 当您拥有比核心更多的可运行进程/线程并且您想给其他线程/进程一个取得进展的机会时(例如,一个线程刚刚给另一个线程一些东西),这是一个有用的调用做和第一个线程进入睡眠等待完成的成本超过(第二个线程做“某事”+第一个线程检查它是否已经完成)的成本。
标签: multithreading linux-kernel yield scheduler