当使用 ReaderWriterLock 时,第二个线程是否实际等待

When using ReaderWriterLock does second thread actually wait or not

我正在尝试使用两个线程写入文件。如果我使用 ReaderWriterLock 并且当一个线程正在写入文件时第二个线程来了,它实际上会等待锁释放还是会跳过写入文件?

是的,文件将关闭写入并且所有写入线程将被放置在写入队列中,但打开以供读取:https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlock?view=netcore-3.1

这取决于你的行动。

多个线程可以在文件锁定时读取文件。*

但是,如果您在锁仍由另一个线程持有时尝试使用不同的线程写入该文件,则(新)线程将等待它获取锁。

请记住可以定义超时。如 documentation

中所述

If the time-out interval expires and the lock request has not been granted, the method returns control to the calling thread by throwing an ApplicationException. A thread can catch this exception and determine what action to take next.

因此,参考您的具体问题:如果设置了 timeout 并且已设置超时,则文件 确实会被跳过 超过.

可以使用 AcquireWriterLock(TimeSpan timeout) 重载来设置超时。


重要的是要记住 - 如果调用 AcquireWriterLock 的线程仍然有一个有效的 reader 锁 - 操作将死锁。

If a thread calls AcquireWriterLock while it still has a reader lock, it will block on its own reader lock; if an infinite time-out is specified, the thread will deadlock. To avoid such deadlocks, use IsReaderLockHeld to determine whether the current thread already has a reader lock.


* 请注意,也可以使用 AcquireReaderLock(int msTimeout) 方法为读取定义超时。如果在授予锁之前超时到期,将抛出 ApplicationException,这意味着读取也将被跳过。