【发布时间】:2015-02-05 12:16:00
【问题描述】:
我在运行 IncrementModelClientReOrderCount 时遇到了死锁,但在我运行 IncrementModelClientReOrderCountLOCK 时问题就消失了。
不同之处在于 lock() 语句。
我假设使用 ConcurrentDictionary 已经减少了死锁的可能性。
我是否错误地使用了 ConcurrentDictionary:
public ConcurrentDictionary<Connection, ModelClient> ModelClients = new ConcurrentDictionary<Connection, ModelClient>();
public bool IncrementModelClientReOrderCount(Connection mc)
{
ModelClient curValue;
while (ModelClients.TryGetValue(mc, out curValue))
{
ModelClient curValue2 = curValue.Clone() as ModelClient;
curValue2.reOrderCount++;
curValue2.DSP.seen = false;
if (ModelClients.TryUpdate(mc, curValue2, curValue))
return true;
}
return false;
}
public bool IncrementModelClientReOrderCountLOCK(Connection mc)
{
lock (ModelClients)
{
ModelClient curValue;
while (ModelClients.TryGetValue(mc, out curValue))
{
ModelClient curValue2 = curValue.Clone() as ModelClient;
curValue2.reOrderCount++;
curValue2.DSP.seen = false;
if (ModelClients.TryUpdate(mc, curValue2, curValue))
return true;
}
return false;
}
}
public class ModelClient : ICloneable
{
public string Symbol;
public int Amount;
public double Price;
public ModelClient(string Symbol, int Amount, double Price)
{
this.Symbol = Symbol;
this.Amount = Amount;
this.Price = Price;
}
public object Clone() { return this.MemberwiseClone(); }
}
【问题讨论】:
-
为什么会认为死锁是由
ConcurrentDictionary引起的? -
@YuvalItzchakov 好的。我承认它可能是别的东西,但它确实发生在方法中。您是否看到其他可能是罪魁祸首的东西?
-
这个问题显然非常需要死锁线程的堆栈跟踪。
-
如果您所做的只是在其上调用方法,则 CD 永远不会死锁。那是因为 CD 永远不会在锁定状态下调用用户代码。还有其他事情在这里不可见。
-
@PeterRitchie CD 可以阻塞但不会死锁。
标签: c# concurrency deadlock concurrentdictionary