c# - 尝试在 sleep 循环中获取锁是否可以(避免死锁、饥饿等...)?

标签 c# .net multithreading deadlock

我正在使用 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/

相关文章:

c# - 如何将自定义 css 样式表添加到 Umbraco Admin

c# - 如何迭代 IGrouping<T> 接口(interface)?

.Net 编程 : What to validate on an SSL self-signed certificate

java - 如何在后台线程中正确执行SQL查询?

java - 调用监听器时强制执行最大允许处理时间

C# 客户端与 C++ 服务器通信 - 服务器可以从套接字读取但写入不成功

c# - 是否可以将泛型重载限制为属性类型?

c# - Windows 窗体在执行中抛出与视觉样式相关的异常

Java:在线程化时更改标签值

c# - 内部构造器