当前位置: 首页 > 编程语言 > C#

readerwriterlock允许读的同时获取写锁?分享

时间:2023-04-11 00:25:22 C#

readerwriterlock获取写锁时允许读?我有一个由多个远程和其他内部应用程序线程访问的静态类。这个类的部分功能是控制对各种文件的读/写访问,所以我在文件列表上实现了一个静态的ReaderWriterLock。该项目使用.netframework2.0作为客户要求的一部分。但是,当我用很多不同的客户端(通常我使用16个)对系统进行压力测试时,每个客户端执行大量的读写,然后非常断断续续,几个小时甚至几天后,至少500k+交易完成。系统故障。好的,我们有一个错误..但是当我检查所有锁定事件的日志时,我可以看到以下情况:1:线程A直接获取写锁,检查IsWriterLock是否为真。2:即使线程A仍然有写锁,线程B尝试获取读锁并成功3:系统现在崩溃并且堆栈跟踪现在显示readerwriterlock的空引用异常这个过程之前已经运行了数十万次没有错误,我可以检查日志并看到读取锁在之前的所有情况下都被阻塞,直到写入退出。我也尝试将ReaderWriterLock实现为单例,但问题仍然存在有没有人见过这样的事情?使用的readerwriterlock实现的简化版本如下所示:privateconstintreadwriterlocktimeoutms=5000;privatestaticReaderWriterLockreaderWriterLock=newReaderWriterLock();//这个方法将被线程A调用publicstaticvoidMethodA(){//bool表示我们有锁boolIsTaken=false;try{//获取锁readerWriterLock.AcquireWriterLock(readwriterlocktimeoutms);//记录我们拥有用于调试的锁//Logger.LogInfo("MethodA:获取写锁;持有写锁{0};持有读锁{1}",readerWriterLock.IsWriterLockHeld.ToString(),readerWriterLock.IsReaderLockHeld。ToString(),);//标记我们已经取得锁IsTaken=true;}catch(Exceptione){thrownewException(string.Format("Errorgettinglock{0}{1}",e.Message,Environment.StackTrace));}try{//做一些工作}finally{if(IsTaken){readerWriterLock.ReleaseWriterLock();}}}//这个方法会被t调用hreadBpublicstaticvoidMethodB(){//bool表明我们有锁boolIsTaken=false;try{//获取锁readerWriterLock.AcquireReaderLock(readwriterlocktimeoutms);//记录我们拥有用于调试的锁//Logger.LogInfo("MethodB:获取读锁;持有写入者锁{0};持有读者锁{1}",readerWriterLock.IsWriterLockHeld.ToString(),readerWriterLock.IsReaderLockHeld。ToString(),);//标记我们已经取得锁IsTaken=true;}catch(Exceptione){thrownewException(string.Format("Errorgettinglock{0}{1}",e.Message,Environment.StackTrace));}try{//做一些工作}finally{if(IsTaken){readerWriterLock.ReleaseReaderLock();}}}在此处输入代码@All终于找到了这个问题的解决方案@Yannick,您走在正确的轨道上...如果MSDN说不可能同时保持读写器锁定。今天我从微软那里得到确认,在多处理器系统的重负载下(注意:我从来没有能够在英特尔系统上重现这个问题)这可能导致ReaderWriterLock类对象的损坏,如果这甚至可能的话增加作者的数量在任何给定阶段都会增长,因为这些可以在队列中备份。在过去的两周里,我一直在使用.Net3.5ReaderWriterLockSlim类运行并且没有遇到这个问题,这对应于Microsoft已经确认readerwriterlockslim类不具有与胖ReaderWriterLock类相同的破坏风险。如果MSDN说不可能同时持有读者锁和作者锁。由于其他原因,您的程序中是否有可能随时有2个readerWriterLock对象?另一个奇怪的事情是,使用isWriterLockHeld调试一个线程,而当前线程是一个读取器不会让您知道在另一个线程中写入。你怎么知道线程A仍然持有写锁,你怎么知道这不是调试日志系统延迟或“混合”线程发出的指令?其他想法,是否有可能共享导致死锁的其他资源?这会以某种方式导致崩溃吗?(尽管NullException仍然很奇怪,除非你考虑清除死锁和readerWriterLock重置。你的问题也很奇怪。和其他问题,这不会解决你的问题。你在使用什么,在调试你的应用程序时,你依赖isWriterLockHeld(orisReaderLockHeld)?为什么不在你的finally块中使用呢?以上是C#学习教程:readerwriterlockallowsreadingwhileacquiresawritelock?分享一下全部内容,如果对大家有用还需要进一步了解C#学习教程,希望大家多多关注~本文采集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载,请注明出处: