我正在尝试使用两个线程写入文件。如果我使用ReaderWriterLock
and 而一个线程正在写入文件并且第二个线程来了,它实际上会等待锁释放还是会跳过写入文件?
2 回答
这取决于你的行动。
多个线程可以在文件被锁定时读取它。*
但是,如果您在锁仍被另一个线程持有的情况下尝试使用不同的线程写入该文件,则(新)线程将等待直到它获得锁。
请记住,可以定义超时。如文档中所述
如果超时间隔到期并且尚未授予锁定请求,则该方法通过抛出 ApplicationException 将控制权返回给调用线程。线程可以捕获此异常并确定下一步要采取的操作。
因此,请参考您的具体问题:如果设置了超时并且已超出该超时,则该文件确实会被跳过。
可以使用AcquireWriterLock(TimeSpan timeout)
重载设置该超时。
重要的是要记住——如果调用的线程AcquireWriterLock
仍然有一个有效的读取器锁——操作将死锁。
如果一个线程调用 AcquireWriterLock 而它仍然有一个读卡器锁,它会阻塞在它自己的读卡器锁上;如果指定了无限超时,线程将死锁。为避免此类死锁,请使用 IsReaderLockHeld 确定当前线程是否已拥有读取器锁。
* 请注意,也可以使用该AcquireReaderLock(int msTimeout)
方法为读取定义超时。ApplicationException
如果在授予锁之前超时到期,则会抛出一个,这意味着读取也将被跳过。
是的,该文件将被关闭写入,所有写入线程将被放置在写入队列中,但打开读取:https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlock?视图=netcore-3.1