3

我想这个问题可以归结为“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

我的蛮力测试(围绕调用 DateTime.Ticks 的 while 循环)并没有真正揭示任何东西(说两种情况下的差异都是 0 滴答声)。

线程创建过程是否足够短以至于旋转更有效?还是大多数教程都建议旋转,因为它稍微优雅一些​​并且时差可以忽略不计?

4

3 回答 3

2

我不知道你为什么要使用任何一种——在我的脑海中,我想不出任何用例来阻塞调用线程,直到新线程处于活动状态,因为“活动”并不意味着它执行了任何操作。如果您需要等待一些代码在新线程中运行后再继续调用线程,您可能需要使用 WaitHandle 或 SpinLock。

于 2011-06-16T01:09:07.270 回答
1

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

于 2011-06-16T01:15:51.400 回答
0

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

于 2011-08-12T04:46:41.760 回答