用于查找第一个事件的适当并发集合



假设我们有一个水果对象的集合。

多个线程可以添加/删除此集合,并且水果类型可以多次出现:

"apple", "pear", "orange", "pear", "apple"

现在,系统可以同时处理不同的水果类型,但如果两个线程尝试处理两个相同类型的对象(例如两个苹果),系统就会崩溃。

因此,当线程试图处理它的当前水果(即苹果)时,它需要检查苹果是否是队列中的第一个苹果。如果它在另一个苹果后面排队,它应该等待。

我本来打算使用ConcurrentQueue,但我不知道如何判断苹果是否是队列中第一个出现的?

是否有合适的集合支持此功能?

您应该跟踪当前加工的水果。

HashSet<string> _inProcess = new HashSet<string>();
bool CanProcessFruit(string fruit)
{
    lock(_inProcess)
    {
        if(_inProcess.Contains(fruit))
            return false;
        _inProcess.Add(fruit);
        return true;
    }
 }
 void EndProcessFruit(string fruit)
 {
      lock(_inProcess)
      {
          _inProcess.Remove(fruit);
      }
 }

请注意,我使用的是HashSet并自己锁定它,而不是ConcurrentDictionary。这是因为我希望CanProcessFruit在一个原子操作中检查集合并将结果添加到集合中。否则,这就是比赛条件。

最新更新