以下 C# 类用于多线程环境。我删除了很多实际代码。几乎同时调用 MethodA 和 MethodB 时会出现问题。IsDepleted 属性中的锁顺序并不能解决问题。从 IsDepleted 属性中删除 lock(WaitingQueue) 可以解决死锁,但是当另一个线程在 WaitingQueue.Count == 0 和 Processing.Count == 0 语句之间从 WaitingQueue 添加/删除项目时,此解决方案会导致问题。
using System.Collections.Generic;
class Example
{
bool IsDepleted
{
get
{
lock (Processing)
{
lock (WaitingQueue)
{
return WaitingQueue.Count == 0
&& Processing.Count == 0;
}
}
}
}
private readonly List<object> Processing = new List<object>();
private readonly Queue<object> WaitingQueue = new Queue<object>();
public void MethodA(object item)
{
lock (WaitingQueue)
{
if (WaitingQueue.Count > 0)
{
if (StartItem(WaitingQueue.Peek()))
{
WaitingQueue.Dequeue();
}
}
}
}
public void MethodB(object identifier)
{
lock (Processing)
{
Processing.Remove(identifier);
if (!IsDepleted)
{
return;
}
}
//Do something...
}
bool StartItem(object item)
{
//Do something and return a value
}
}