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

最佳答案

在使用requestCallbacks方法锁定之前,您是否还有第二段代码将AcquireReaderLock()锁定?如果是这样,它可能会因此陷入僵局。

在通常情况下,添加循环和 sleep 延迟以避免死锁是行不通的。一般情况下,使用严格的hierarchy of lock acquisition即可。

关于c# - 尝试在 sleep 中获得锁是可以的(避免死锁,饥饿等)吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6351552/

10-10 07:28