3

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

但是,由于此集合旨在被并发访问,因此可能会在 IsEmpty 返回后另一个线程将修改该集合,从而使结果无效。

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

如果并发队列为空,我想要一段代码检查另一个线程。像这样的东西:

while (!queue.IsEmpty)
{
}

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

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

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

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

那么“伯爵”呢?我在 MSDN 上找不到答案……同样的故事?

4

1 回答 1

6

不,这与记忆障碍无关。只是在你的测试之后,其他东西可能会在队列中添加或删除一些东西。

你不应该真的使用IsEmpty. 改为使用TryDequeue。或使用BlockingCollection.

你真的不想开始编写代码来“锁定”队列,而你却弄乱了IsEmptyor Count

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

于 2013-03-22T10:15:57.147 回答