有人可以解释一下:
如果在代码中的任何地方插入 Thread.Yield()会导致或破坏程序,那么几乎肯定会有错误。
答案 0 :(得分:5)
我只能猜测作者的意图,但是:线程调度已经不确定了。如果添加yield使其工作,那么我推断这里的现实是它依赖于竞争条件的副作用,即将一些CPU提供给另一个线程允许时间重合以使正确的事情发生。好吧,你不知道你在并行系统上屈服的 ,而在一个milticore系统上你可能不会屈服于同样的东西(产量相同)仅限CPU)。因此,唯一的 sane 方法是使用诸如Monitor,Mutex,Semaphore,ResetEvent或其他一些锁定原语的结构,这些原语被设计用于允许线程和(有时)进程之间的受控流。
答案 1 :(得分:2)
我的假设,我已经讨论过here,Thread.Yield
会产生一个隐含的记忆障碍。如果您遇到内存障碍问题,可以通过添加对Thread.Yield
的调用来消失。这类似于使用Thread.Sleep
来模拟线程交错实际上可以最终屏蔽问题。此外,Thread.Yield
显然会改变指令执行的时间,并且会对是否观察到竞争条件产生影响。