我正在使用 ReaderWriterLock 类来锁定一个 Quotes 集合,它是一个 SortedDictionary。我正在考虑使用 while 循环,直到线程可以获取读取器锁,以防它被暂时锁定以进行写入。第一个问题,我的测试工作正常,但这种方法有缺点吗?第二个问题,这样做的最佳/最佳实践方法是什么?
public void RequestQuote(string symbol, QuoteRequestCallback qrc)
{
// add the call back on a list and take care of it when the quote is available
while (!AcquireReaderLock(100)) Thread.Sleep(150);
if (Quotes.ContainsKey(symbol))
{
qrc(Quotes[symbol]);
rwl.ReleaseReaderLock();
}
else
{
rwl.ReleaseReaderLock();
lock (requestCallbacks)
requestCallbacks.Add(new KeyValuePair<string, QuoteRequestCallback>(symbol, qrc));
// request symbol to be added
AddSymbol(symbol);
}
}
private bool AquireReaderLock(int ms)
{
try
{
rwl.AcquireReaderLock(ms);
return true;
}
catch (TimeoutException)
{
return false;
}
}
private bool AquireWriterLock(int ms)
{
try
{
rwl.AcquireWriterLock(ms);
return true;
}
catch (TimeoutException)
{
return false;
}
}
最佳答案
在使用 AcquireReaderLock()
方法锁定之前,您是否有第二段代码锁定 requestCallbacks
?如果是这样,它可能会因此陷入僵局。
添加循环和 sleep 延迟以避免死锁在一般情况下是行不通的。严格hierarchy of lock acquisition 将在一般情况下工作。
关于c# - 尝试在 sleep 循环中获取锁是否可以(避免死锁、饥饿等...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6351552/