假设我们有一个水果对象的集合。
多个线程可以在此集合中添加/删除,并且水果类型可以多次出现:
"apple", "pear", "orange", "pear", "apple"
现在系统可以同时处理不同的水果类型,但如果2个线程尝试并处理相同类型的2个对象(例如2个苹果),它将会中断。
因此,当一个线程试图处理它当前的水果(即苹果)时,它需要检查苹果是队列中的第一个苹果。如果它排在另一个苹果后面,它应该等待。
我打算使用ConcurrentQueue,但我看不出如何判断苹果是否是第一次出现在队列中?
是否有合适的集合支持此功能?
答案 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
检查集合并在一个原子操作中将水果添加到集合中。否则,这是一场竞争条件。