gpt4 book ai didi

c# - 如何防止以下 C# 代码中的死锁?

转载 作者:行者123 更新时间:2023-11-30 19:52:07 31 4
gpt4 key购买 nike

以下 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
}
}

最佳答案

这取决于您是想要快速修复还是严格修复。

一种快速解决方法是在所有情况下只使用一个锁对象。

例如private readonly object _lock = new object();

然后锁定它。但是,根据您的情况,这对性能的影响可能超出您的接受范围。

即你的代码会变成这样:

using System.Collections.Generic;

class Example
{
private readonly object _lock = new object();

bool IsDepleted
{
get
{
lock (_lock)
{
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 (_lock)
{
if (WaitingQueue.Count > 0)
{
if (StartItem(WaitingQueue.Peek()))
{
WaitingQueue.Dequeue();
}
}
}
}

public void MethodB(object identifier)
{
lock (_lock)
{
Processing.Remove(identifier);
if (!IsDepleted)
{
return;
}
}
//Do something...
}

bool StartItem(object item)
{
//Do something and return a value
}
}

关于c# - 如何防止以下 C# 代码中的死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/444191/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com