当等待一个新线程生成时,调用thread.sleep()。

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

我的非常暴力的测试(在while循环中调用DateTime.Ticks)并没有真正揭示任何东西(两个实例的差异都为0个tick)。线程创建过程是否足够短,以至于旋转更有效?还是大多数教程建议旋转,因为它略微更优雅,时间差异可以忽略不计?

3个回答

2

我不知道为什么你会使用这两种方法。就我个人而言,我无法想到任何一种情况需要阻塞调用线程直到新线程启动,因为“Alive”并不意味着它已经执行了任何操作。如果你需要等待新线程中的某些代码运行完毕后再继续调用线程,那么你应该使用WaitHandle或SpinLock。


如果新线程在安全使用之前需要分配一些资源,那么可能需要这样做。某些资源(例如Windows消息队列)绑定到创建它们的线程,因此不能在构造函数中分配它们 - 必须由新线程分配。如果构造函数不等待新线程分配这些资源,则有可能要求该线程执行操作,但由于尚未分配资源,因此可能会失败。像Dani建议的那样向线程传递事件是可以的。 - Martin James

1

你可以让线程在启动时设置一个事件,然后让主线程等待该事件。不要使用自旋等待,也不要使用过长的睡眠时间。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接