代码之家  ›  专栏  ›  技术社区  ›  Drake

Thread的目的是什么。SpinWait方法?

  •  61
  • Drake  · 技术社区  · 16 年前

    MSDN 它的目的并不明确。

    5 回复  |  直到 16 年前
        1
  •  106
  •   gbjbaanb    16 年前

    当你进行多线程锁定时,如果你试图获取的资源已经被锁定,你通常会进入睡眠状态,等待它空闲。当你这样做时,你放弃了调度器分配给你的剩余时间来使用处理器,这样其他人就可以尝试了。 通常情况下,这很好,特别是对于长时间的等待,比如等待IO,在等待磁盘主轴旋转的同时,CPU上可能会运行大量其他进程。

    然而,有时你只是在等待一小段时间。在这些情况下,你通常会放弃剩余的时间,等待所有其他线程完成他们的任务,然后再尝试。所以你可以作弊,而不是等待,你坐在那里不断地投票,问“我们快到了吗?”?“方式。如果锁只保留了剩余时间的一小部分,这将成为一种非常有效的等待方式,它也非常有效,因为调度器不必参与重新排列所有其他线程来使用你正常等待时放弃的时间。

    显然,如果你每次想要锁的时候都旋转,你就不会很受欢迎,你的应用程序会变得迟钝,并使用100%的CPU,但在适当的时候,在很小的剂量下,它会使应用程序反应更灵敏。

        2
  •  76
  •   Jon Skeet    16 年前

    非常非常快 。通常,如果你在等待什么,你会让线程进入睡眠状态,处理器/操作系统会上下文切换到另一个线程。上下文切换并不是特别便宜,所以如果你对情况有深入的了解,并认为等待比上下文切换便宜,你就可以旋转等待。

    我的建议是:如果你需要问,你不需要使用它。(我自己从来没有想要过它。)基本上,它是在极少数情况下真正有用的东西之一,但大多数人应该远离它。

        3
  •  15
  •   Jason Evans    12 年前
        4
  •  6
  •   Konrad Rudolph    16 年前

    就我而言(我很高兴更正!),自旋等待的唯一用途是在实现锁定或线程间回调机制时。两者都不应该手动完成(通常),因为它们已经存在了。

    当你锁定了一个资源,而另一个线程请求同步访问它时,它基本上必须等待第一个线程完成对它的使用。这种等待可以通过简单地在循环中旋转来完成(或者如Jon所述的睡眠+上下文切换)。

    推荐文章