在查看 IsEmpty 时,我在 MSDN 上注意到了这一点:
但是,由于此集合旨在被并发访问,因此可能会在 IsEmpty 返回后另一个线程将修改该集合,从而使结果无效。
当然这是真的,但这是否也意味着 ConcurrentQueue 在检查队列是否为空时不使用读屏障?
如果并发队列为空,我想要一段代码检查另一个线程。像这样的东西:
while (!queue.IsEmpty)
{
}
但是.. 如果 ConcurrentQueue 不使用读取屏障,我会说我们需要添加自己的内存屏障以确保我们读取正确的数据,如下所示:
Thread.MemoryBarrier();
while (!queue.IsEmpty)
{
Thread.MemoryBarrier();
}
(顺便说一句:这些只是说明情况的一个最小示例,实际上还有更多代码)。
我的观察正确吗?或者 ConcurrentQueue 是否处理此问题并且第一个实现是否有效?(例如,我对“并发”的期望是什么)?
那么“伯爵”呢?我在 MSDN 上找不到答案……同样的故事?