gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:06:24 28 4
gpt4 key购买 nike

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

However, as this collection is intended to be accessed concurrently, it may be the case that another thread will modify the collection after IsEmpty returns, thus invalidating the result.

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

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

while (!queue.IsEmpty)
{
}

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

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

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

我的观察是否正确?还是 ConcurrentQueue 处理这个问题并且第一个实现工作? (例如,我对“并发”的期望是什么)?

那么“计数”呢?我在 MSDN 上找不到答案...同样的故事?

最佳答案

不,这与内存障碍无关。很简单,在您的测试之后,其他东西可能会介入并向队列中添加或从队列中删除某些东西。

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

您真的不想开始编写“锁定”队列的代码,同时您还在乱用 IsEmptyCount

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

关于c# - ConcurrentQueue.IsEmpty 是否需要内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15567748/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com