用于查找第一次出现的适当并发收集

时间:2014-10-29 20:31:02

标签: c#

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

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

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

现在系统可以同时处理不同的水果类型,但如果2个线程尝试并处理相同类型的2个对象(例如2个苹果),它将会中断。

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

我打算使用ConcurrentQueue,但我看不出如何判断苹果是否是第一次出现在队列中?

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

1 个答案:

答案 0 :(得分:1)

您应该跟踪当前处理过的水果。

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检查集合并在一个原子操作中将水果添加到集合中。否则,这是一场竞争条件。