atl*_*ste 4 .net c# concurrency
在调查IsEmpty时,我在MSDN上注意到了这一点:
但是,由于此集合旨在同时访问,因此可能是另一个线程将在IsEmpty返回后修改集合,从而使结果无效.
当然这是真的,但这是否也意味着ConcurrentQueue在检查队列是否为空时不使用读屏障?
我希望有一段代码,如果并发队列为空,则检查另一个线程.像这样的东西:
while (!queue.IsEmpty)
{
}
但是..如果ConcurrentQueue不使用读屏障,我会说我们需要添加自己的内存屏障,以确保我们读取正确的数据,如下所示:
Thread.MemoryBarrier();
while (!queue.IsEmpty)
{
    Thread.MemoryBarrier();
}
(顺便说一句:这只是举例说明案例的最小例子,现实中有更多代码).
我的观察是否正确?或者ConcurrentQueue是否处理这个并且第一个实现是否有效?(例如,我对'并发'的期望是什么)?
那么'伯爵'怎么样?我在MSDN上找不到答案......同样的故事?
不,这与记忆障碍无关.简单地说,在测试之后,其他东西可以插入并添加或删除队列中的某些内容.
你不应该真的使用IsEmpty.请TryDequeue改用.或者使用BlockingCollection.
你真的不想要开始写代码,"锁定"的队列中,而你更动IsEmpty或Count.
(我现在几乎从不使用ConcurrentQueue,因为BlockingCollection它好多了,虽然这当然取决于你想要做什么.)