更新:我不是StackOverflow的常规用户,因此表示歉意,但是我看不到将其私下发送给主持人的方法我认为将这个线程锁定为主题是非常不公平且繁重的工作,并说我必须发布示例代码等。我已经解释说它是一个大型复杂的应用程序,我将不得不发布数十行代码,所有人都无法理解。并非所有软件问题都足够简单,可以归结为10行示例代码!
基本问题是体系结构问题,我尽力解释了我有2个异步线程需要锁定两个资源,然后这2个锁也是在主线程中访问。由于异步的性质。我看不到如何控制锁顺序和两个锁的交织以始终保证没有死锁。
是的,建议我只做一次锁定即可锁定所有内容,但是性能下降会非常糟糕,因此我无法真正选择这种简单的解决方案。我希望当异步场景中需要多个锁时,有一种性能更高的经典解决方案。
无论如何,感谢您在关闭之前得到的答复,我感谢您的宝贵时间,并在这些困难时期给予帮助。
问候
我正在用C#编写一个相当大的应用程序,它有2个异步线程,一个线程接收商品价格数据流,而一个线程接收订单明细流。
这些线程中的每一个都使用各自的ReaderWriterLockSlim构建传入价格/订单数据的列表。将传入数据移到列表时,设置为写锁定模式。
传入流的频率变化很大且不可预测,有时商品价格数据包可能以10 ish millisec的间隔进入,因此我需要对此进行有效编码,否则它将变得非常缓慢。
最初,我只是在读取主线程中的列表(ReaderWriterLockSlim读取锁),所以工作正常。但是,我现在有一个要求,有时我需要在主线程中对两个数据列表进行一些写操作。是的,您猜对了,有了额外的写锁,我现在得到了随机死锁,我可以肯定这是由交错访问2个独立锁引起的经典死锁。
由于传入数据的非常异步的性质,相对于我的主线程在两个列表上进行的任何处理,我无法预测何时这些线程将被写入或读取以锁定列表。
据我所知,这总是容易陷入僵局。我非常执着于如何更改体系结构以解决此死锁问题。
如果有人能提出一些有关如何解决此问题的想法,我将非常感激。
代码示例。一个线程运行此代码:
lock (locker1)
{
list1.Add("Something");
lock (locker2)
{
list2.Add("Something");
}
}
...同时另一个线程运行此代码:
lock (locker2)
{
list2.Add("Something");
lock (locker1)
{
list1.Add("Something");
}
}
是否有可能避免随之而来的死锁,而无需按获取锁的顺序引入限制?
((1)当您描述代码而不是显示代码时,很难说出问题出在哪里。
我可以想到的一种简单方法是在主线程中维护一条消息队列,其中每条消息将包含您拥有的两个流之一中的流,并且您可以根据中的另一个参数来区分两个流消息。