在等待新线程生成时调用thread.sleep()

时间:2011-06-16 00:56:35

标签: c# multithreading spinwait

我认为这个问题可归结为“SpinWait vs. Block?”,但我认为可能会有一个更有趣的答案,为什么几乎每个C#线程教程都会建议以下调用:

Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) ;
Thread.Sleep(1); // Allow the new thread to do some work

与阻止相反:

Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) Thread.Sleep(1);
Thread.Sleep(1); // Allow the new thread to do some work

我的强力测试(围绕while循环调用DateTime.Ticks)并没有真正揭示任何东西(说两个实例中的差异是0刻度)。

线程创建过程是否足够短,以至于旋转效率更高?或者大多数教程都建议旋转,因为它更优雅,时差可以忽略不计?

3 个答案:

答案 0 :(得分:2)

我不知道你为什么要使用我的头脑,我想不出任何阻止​​调用线程的用例,直到新线程活着,因为“Alive”不会这意味着它已经执行了任何事情。如果你需要等待一些代码在继续调用线程之前在新线程中运行,你需要使用WaitHandle或SpinLock。

答案 1 :(得分:1)

您可以在线程启动时使线程设置为事件,并使主线程等待事件。没有spinwait没有太长时间睡觉。

答案 2 :(得分:0)

这篇文章解释了SpinWait的使用,并提到了不同类型的睡眠http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html