如何解决尝试在睡眠中获取锁是可以的避免死锁,饥饿等吗?
| 我正在使用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
?如果是这样,它可能会因此陷入僵局。
通常情况下,添加循环和睡眠延迟以避免死锁是行不通的。在一般情况下,严格的锁获取层次结构将起作用。
, 我不太了解您要达到的目标。 ReaderWriterLockSlim
(我将使用)已经表现出这种方式,无需费吹灰之力-无需额外旋转,您只是在浪费资源。 a)如果找不到符号或更好的符号,则将R-Lock升级为W-Lock,将R和W访问分为不同的方法。 b)不要提供从受保护部分内部调用未知代码的可能性
public void RequestQuote(string pS,QuoteRequestCallback pQrc) {
Quote tQ;
// acquire/release ReadLock inside TryGet
if (TryGetQuote(pS,out tQ)) {
pQrc(tQ);
} else {
// acquire/release WriteLock inside AddQuote
// remark: I left the other collection
// out since it seems unrelated to the actual problem
AddQuote(new KeyValuePair(...)); // as above
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。