【发布时间】:2015-05-19 21:55:52
【问题描述】:
只有在满足某些条件时,我才能将ConcurrentQueue 的下一个元素出列?
例如如果下一个要出队的项目满足某个条件,则将其出队,否则离开。本质上是'DequeueIf' 或'TryDequeueIf' 方法
例子:
var myQueue = new ConcurrentQueue<int>()
...
int item;
// only dequeue if the next item is 0
bool success = myQueue.TryDequeueIf(out item, x=>x==0)
当然可以先调用TryPeek,检查条件,然后TryDequeue,但这不再是线程安全的。
我可以将整个TryPeek & TryDequeue 包裹在一个锁中,但这有点违背了使用 ConcurrentQueue 的目的;并且意味着所有常规的无条件出队也必须被锁定。我不确定我是否必须锁定每个Enqueue 才能保存。如果可能的话,我想避免实施我自己的锁定策略可能出现的陷阱。
是否有使用 .net4.0 ConcurrentQueue 类或其他并发类之一的无锁解决方案?
【问题讨论】:
标签: c# multithreading concurrency locking queue