当使用 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
,这意味着读取也将被跳过。
我正在尝试使用两个线程写入文件。如果我使用 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
,这意味着读取也将被跳过。