ConcurrentQueue.IsEmpty是否需要内存屏障?

时间:2013-03-22 10:13:04

标签: c# .net concurrency

在调查IsEmpty时,我在MSDN上注意到了这一点:

  

但是,由于此集合旨在同时访问,因此可能是另一个线程在IsEmpty返回后修改集合的情况,从而使结果无效。

当然这是真的,但这是否也意味着ConcurrentQueue在检查队列是否为空时不使用读屏障?

如果并发队列为空,我想要一段代码检查另一个线程。像这样:

while (!queue.IsEmpty)
{
}

但是..如果ConcurrentQueue不使用读屏障,我会说我们需要添加自己的内存屏障,以确保我们读取正确的数据,如下所示:

Thread.MemoryBarrier();
while (!queue.IsEmpty)
{
    Thread.MemoryBarrier();
}

(顺便说一下:这只是举例说明案例的最小例子,现实中有更多代码)。

我的观察是否正确?或者ConcurrentQueue是否处理这个并且第一个实现是否有效? (例如我对'并发'的期望)?

那么'伯爵'呢?我在MSDN上找不到答案......同样的故事?

1 个答案:

答案 0 :(得分:5)

不,它与记忆障碍无关。它只是必须是这样的情况:在测试之后,其他东西可以插入并添加或从队列中删除。

你不应该真正使用IsEmpty。请改用TryDequeue。或者使用BlockingCollection

你真的不想开始编写"锁定"在您使用IsEmptyCount时陷入困境。

(我现在几乎从不使用ConcurrentQueue,因为BlockingCollection要好得多,尽管这当然取决于你想要做的事情。)