ConcurrentQueue.IsEmpty需要一个内存屏障

本文关键字:一个 内存 IsEmpty ConcurrentQueue | 更新日期: 2023-09-27 18:05:21

在查看IsEmpty时,我在MSDN上注意到:

然而,由于这个集合是打算并发访问的,可能会有另一个线程在IsEmpty返回后修改集合,从而使结果无效。

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

我想有一段代码检查另一个线程的并发队列是否为空。像这样:

while (!queue.IsEmpty)
{
}
然而

. .如果ConcurrentQueue没有使用读屏障,我想说我们需要添加我们自己的内存屏障来确保我们读取正确的数据,像这样:

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

(顺便说一句:这些只是一个最小的例子来说明这种情况,实际上有更多的代码)。

我的观察正确吗?还是ConcurrentQueue处理这个和第一个实现工作?(例如,我对'Concurrent'的期望是什么)?

那Count呢?我在MSDN上找不到答案…同样的故事吗?

ConcurrentQueue.IsEmpty需要一个内存屏障

不,这与内存屏障无关。仅仅是在测试之后,其他东西可以插入并向队列添加或从队列中删除一些东西。

你真的不应该使用IsEmpty。使用TryDequeue代替。或者使用BlockingCollection

当你在IsEmptyCount上乱搞的时候,你真的不想开始写代码来"锁定"队列。

(我现在几乎从不使用ConcurrentQueue,因为BlockingCollection好多了,尽管这当然取决于你想做什么。)