繁体   English   中英

Thread.Sleep SpinWait.SpinUntil 奇怪的行为

[英]Thread.Sleep SpinWait.SpinUntil weird behavior

我有下面的代码。

namespace SandBox
{
    static class Program
    {
        static ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
        static void Main()
        {
            Timer timer = new Timer(worker, null, 0, 3000);
            while (true)
            {
                SpinWait.SpinUntil(IsEmpty); //???? freezes up here
                string snippet;
                while (!queue.TryDequeue(out snippet))
                    Thread.Sleep(1);
                Console.WriteLine(snippet);
                Thread.Sleep(5000); //??????
            }
        }
        static void worker(object x)
        {
            queue.Enqueue("***___***___***");
        }

        static bool IsEmpty()
        {
            return queue.IsEmpty;
        }
    }
}

如果我不包括Thread.Sleep(5000); 它按预期工作。 但是,如果我这样做,它只输出一行,然后在 SpinUntil 部分冻结,不会再输出任何行。 如果我停止它并检查 queue.IsEmpty 是否为真,调试器会说它实际上是假的! (工人确实被定期调用,我检查了一个断点。)此外,IsEmpty 也被调用并返回 false。

怎么了?

SpinWait.SpinUntil旋转直到满足指定条件。 在你的情况下,条件是IsEmpty ,所以它会旋转直到队列为空(或者,如果你愿意,队列不为空时)。

由于等待您给了线程时间将某些东西放入队列中,因此微调器将继续旋转,因为它在应该清空队列的线程中,但它不能,因为它正在等待微调器。

如果更容易理解, SpinUntil(IsEmpty)SpinWhile(IsNotEmpty)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM