对Thread.Yield假设的解释

时间:2011-08-06 19:02:25

标签: c# .net multithreading race-condition

有人可以解释一下:

  

如果在代码中的任何地方插入 Thread.Yield()会导致或破坏程序,那么几乎肯定会有错误。

我在这里阅读:http://www.albahari.com/threading/

2 个答案:

答案 0 :(得分:5)

我只能猜测作者的意图,但是:线程调度已经不确定了。如果添加yield使其工作,那么我推断这里的现实是它依赖于竞争条件的副作用,即将一些CPU提供给另一个线程允许时间重合以使正确的事情发生。好吧,你不知道你在并行系统上屈服的 ,而在一个milticore系统上你可能不会屈服于同样的东西(产量相同)仅限CPU)。因此,唯一的 sane 方法是使用诸如Monitor,Mutex,Semaphore,ResetEvent或其他一些锁定原语的结构,这些原语被设计用于允许线程和(有时)进程之间的受控流。

答案 1 :(得分:2)

我的假设,我已经讨论过hereThread.Yield会产生一个隐含的记忆障碍。如果您遇到内存障碍问题,可以通过添加对Thread.Yield的调用来消失。这类似于使用Thread.Sleep来模拟线程交错实际上可以最终屏蔽问题。此外,Thread.Yield显然会改变指令执行的时间,并且会对是否观察到竞争条件产生影响。