2011-06-16 82 views
3

我想这个问题可以归结为“SpinWait vs. Block?”,但我想到可能有一个更有趣的答案,为什么几乎每个C#线程教程提出以下电话:在等待新线程产生时调用thread.sleep()

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 

我非常强力测试(与周边调用DateTime.Ticks while循环)并没有真正显示任何东西(说在两种情况下差异是0滴答)。

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

回答

2

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

+0

的。一些资源(例如Windows消息队列)绑定到创建它们的线程,因此不能在ctor中分配 - 它们必须由新线程分配。如果ctor不等待新线程分配这些资源,那么线程可能会被要求执行一个将失败的动作,因为它尚未轮到分配资源。按照Dani的建议,将事件传递给线程是可以的。 – 2011-06-16 08:20:20

1

您可以让线程在启动时设置一个事件,并在事件上等待主线程。没有spinwait没有太久睡觉。