При использовании ReaderWriterLock второй поток действительно ждет или нет - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь записать в файл двумя потоками. Если я использую ReaderWriterLock и пока один поток пишет в файл, а второй поток приходит, будет ли он на самом деле ждать освобождения блокировки или просто пропустит запись в файл?

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Это зависит от вашего действия.

Несколько потоков могут читать файл, когда он заблокирован. *

Однако, если вы пытаетесь записать в этот файл другим потоком, когда блокировка все еще удерживается другим потоком, (новый) поток будет ждать, пока не получит блокировку.

Имейте в виду, что можно определить тайм-аут. Как указано в документации

Если интервал тайм-аута истекает и запрос блокировки не был предоставлен, метод возвращает управление вызывающему потоку, генерируя ApplicationException. Поток может перехватить это исключение и определить, какое действие предпринять дальше.

Итак, ссылаясь на ваш конкретный c вопрос: файл действительно будет пропущен , если * 1017 Установлен * тайм-аут , и этот тайм-аут был превышен .

Этот тайм-аут можно установить с помощью перегрузки AcquireWriterLock(TimeSpan timeout).


Что важно помнить, так это то, что - если поток, вызывающий AcquireWriterLock, все еще имеет действующую блокировку считывателя, операция зайдет в тупик.

Если поток вызывает AcquireWriterLock, пока у него еще есть считыватель lock, он будет заблокирован самим блокировкой считывателя; если указан бесконечный тайм-аут, поток зайдет в тупик. Чтобы избежать таких взаимоблокировок, используйте IsReaderLockHeld, чтобы определить, имеет ли текущий поток уже блокировку чтения.


* Обратите внимание, что тайм-аут также может быть определен для чтения с помощью AcquireReaderLock(int msTimeout) метод. Если время ожидания истечет до того, как блокировка будет предоставлена, будет выдано ApplicationException, что означает, что чтение также будет пропущено.

0 голосов
/ 06 мая 2020

Да, файл будет закрыт для записи, и все потоки записи будут помещены в очередь записи, но открыты для чтения: https://docs.microsoft.com/en-us/dotnet/api/system.threading.readerwriterlock?view=netcore-3.1

...