假设我们有一个水果对象的集合。
多个线程可以添加/删除此集合,并且水果类型可以多次出现:
"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
在一个原子操作中检查集合并将结果添加到集合中。否则,这就是比赛条件。