当研究IsEmpty时,我注意到MSDN上的这个内容:
“然而,由于该集合旨在同时访问,因此可能会有另一个线程在IsEmpty返回后修改集合,从而使结果无效。”
虽然这是正确的,但这是否也意味着ConcurrentQueue在检查队列是否为空时不使用读屏障呢?
我想编写一段代码,在另一个线程中检查并发队列是否为空。类似这样:
“然而,由于该集合旨在同时访问,因此可能会有另一个线程在IsEmpty返回后修改集合,从而使结果无效。”
虽然这是正确的,但这是否也意味着ConcurrentQueue在检查队列是否为空时不使用读屏障呢?
我想编写一段代码,在另一个线程中检查并发队列是否为空。类似这样:
while (!queue.IsEmpty)
{
}
然而,如果ConcurrentQueue没有使用读取屏障,我认为我们需要添加自己的内存屏障以确保我们读取正确的数据,像这样:
Thread.MemoryBarrier();
while (!queue.IsEmpty)
{
Thread.MemoryBarrier();
}
顺便说一句:这只是一个最简单的示例以说明这种情况,实际上还有更多的代码)。
我的观察正确吗?或者ConcurrentQueue处理了这个问题,第一种实现方式可以工作吗?(例如,我从'Concurrent'中期望的结果是什么?)
'Count'呢?我在MSDN上找不到答案...是同样的情况吗?