在调查IsEmpty时,我在MSDN上注意到了这一点:
但是,由于此集合旨在同时访问,因此可能是另一个线程在IsEmpty返回后修改集合的情况,从而使结果无效。
当然这是真的,但这是否也意味着ConcurrentQueue在检查队列是否为空时不使用读屏障?
如果并发队列为空,我想要一段代码检查另一个线程。像这样:
while (!queue.IsEmpty)
{
}
但是..如果ConcurrentQueue不使用读屏障,我会说我们需要添加自己的内存屏障,以确保我们读取正确的数据,如下所示:
Thread.MemoryBarrier();
while (!queue.IsEmpty)
{
Thread.MemoryBarrier();
}
(顺便说一下:这只是举例说明案例的最小例子,现实中有更多代码)。
我的观察是否正确?或者ConcurrentQueue是否处理这个并且第一个实现是否有效? (例如我对'并发'的期望)?
那么'伯爵'呢?我在MSDN上找不到答案......同样的故事?
答案 0 :(得分:5)
不,它与记忆障碍无关。它只是必须是这样的情况:在测试之后,其他东西可以插入并添加或从队列中删除。
你不应该真正使用IsEmpty
。请改用TryDequeue
。或者使用BlockingCollection
。
你真的不想开始编写"锁定"在您使用IsEmpty
或Count
时陷入困境。
(我现在几乎从不使用ConcurrentQueue
,因为BlockingCollection
要好得多,尽管这当然取决于你想要做的事情。)