在查看iEmpty时,我在msdn上注意到:
但是,由于此集合是打算同时访问的,因此可能是在ISempty返回后,另一个线程将修改集合,从而使结果无效。
当然这是真的,但这是否也意味着concurrentqueue在检查队列是否为空时不使用读取屏障?
如果并发队列为空,我希望有一段代码可以检入另一个线程。像这样的:

while (!queue.IsEmpty)
{
}

然而。。如果concurrentqueue不使用读取屏障,我会说我们需要添加自己的内存屏障,以确保读取正确的数据,例如:
Thread.MemoryBarrier();
while (!queue.IsEmpty)
{
    Thread.MemoryBarrier();
}

(顺便说一下:这些只是一个很小的例子来说明这个情况,实际上还有更多的代码)。
我的观察正确吗?或者concurrentqueue处理这个问题并且第一个实现工作吗?(例如,我对“并发”的期望是什么?)
“伯爵”呢?我在MSDN上找不到答案…同样的故事?

最佳答案

不,这和记忆障碍无关。简单地说,就是在您的测试刚刚结束时,其他东西可能会挤进队列,在队列中添加或删除一些东西。
你不应该真的使用IsEmpty。改为使用TryDequeue。或者使用BlockingCollection
您真的不想在处理IsEmptyCount时开始编写“锁定”队列的代码。
(我现在几乎从不使用ConcurrentQueue,因为BlockingCollection好多了,尽管这当然取决于你想做什么。)

07-26 05:33