IncrementModelClientReOrderCount를 실행할 때 교착 상태가 발생하지만 IncrementModelClientReOrderCountLOCK을 실행하면 문제가 사라집니다.왜이 TryGetValue/TryUpdate가 ConcurrentDictionary에서 교착 상태에 빠질 수 있습니까?
차이점은 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 OK. 나는 그것이 다른 것일지도 모르지만 그 방법에서 발생합니다. 범인이 될만한 다른 것을 본 적이 있습니까? – ManInMoon
'복제 '는 맞춤 구현입니까? –