【问题标题】:Calling thread.sleep() while waiting for a new thread to spawn在等待新线程产生时调用 thread.sleep()
【发布时间】:2011-09-16 00:00:17
【问题描述】:

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

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

【问题讨论】:

    标签: c# multithreading spinwait


    【解决方案1】:

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

    【讨论】:

    • 如果新线程需要分配一些资源才能安全使用,这可能是必需的。某些资源(例如 Windows 消息队列)绑定到创建它们的线程,因此不能在 ctor 中分​​配 - 它们必须由新线程分配。如果 ctor 不等待新线程分配此类资源,则可能会要求线程执行将失败的操作,因为它还没有分配资源。按照 Dani 的建议,将事件传递给线程是可以的。
    【解决方案2】:

    您可以让线程在启动时设置一个事件,并让主线程等待该事件。 no spinwait 不要睡太久。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-24
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多