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

atl*_*ste 4 .net c# concurrency

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

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

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

我希望有一段代码,如果并发队列为空,则检查另一个线程.像这样的东西:

while (!queue.IsEmpty)
{
}
Run Code Online (Sandbox Code Playgroud)

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

Thread.MemoryBarrier();
while (!queue.IsEmpty)
{
    Thread.MemoryBarrier();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mat*_*son 5

不,这与记忆障碍无关.简单地说,在测试之后,其他东西可以插入并添加或删除队列中的某些内容.

你不应该真的使用IsEmpty.请TryDequeue改用.或者使用BlockingCollection.

你真的不想要开始写代码,"锁定"的队列中,而你更动IsEmptyCount.

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

  • 我现在几乎从不使用 BlockingCollection,因为 BufferBlock(以及 TPL Dataflow 的其余部分)要好得多;) (2认同)