gpt4 book ai didi

c# - 仅当满足条件时才从 ConcurrentQueue 中出队

转载 作者:太空狗 更新时间:2023-10-30 00:51:02 25 4
gpt4 key购买 nike

如何仅在满足某些条件时才将 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 类或其他并发类之一的无锁解决方案?

最佳答案

使用内置方法无法做到这一点。怎么办?

  1. 编写您自己的简单队列。只需为每个队列使用一个锁。除非您的队列中有非常的高流量,否则这将执行得很好。无竞争锁每个周期消耗两个互锁操作。
  2. 使用互锁操作编写复杂的队列。使用 CAS 重试循环,您可以实现谓词原子获取操作。您可能可以使用 BCL 源代码作为起点或灵感。
  3. 放弃排队的想法。在非队列上执行此操作很容易。如果您画错了项目,只需将其重新插入队列即可。

关于c# - 仅当满足条件时才从 ConcurrentQueue 中出队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30336853/

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