我使用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永不返回true,会发生什么情况?你的程序是否保持一致的状态? – 2011-06-15 00:02:15
如果AcquireReaderLock永远不会返回true,则RequestQuote会挂起无限循环。我将在编辑中粘贴代码。 – bkarj 2011-06-15 00:09:06
嗯,我的观点是你不能认为它会。所以,如果超过了一定的重试次数,你需要一些机制来打破你的等待循环。 – 2011-06-15 00:10:35