Во-первых, вы должны использовать новый класс ReaderWriterLockSlim
, который более эффективен, чем старый, а также позволяет избежать многих случаев возможного тупика.
Во-вторых, невозможно, чтобы писатель не дождался ни одного потока, который уже имеет блокировку чтения (или записи) в то время, когда писатель хочет писать - это фундаментальная часть требований читателя/запись.
В-третьих, авторы имеют приоритет над читателями, когда они ждут блокировки записи.
Из документации ReaderWriterLockSlim.EnterWriteLock()
:
Если другие потоки вошли в замок в режиме чтения, поток, который вызывает метод блоков EnterWriteLock, пока эти потоки не выходили режим чтения.
Когда есть потоки, ожидающие, чтобы войти в режиме записи, дополнительные нити, которые пытаются ввести не режим или обновляемый в режиме чтения блока, пока все потоки, ожидающие, чтобы войти в режиме записи либо уже истекли, или перейдут в режим записи, а затем вышли из нее ,
В этом отношении он отличается от ReaderWriterLock
- это выглядит как одна из вещей, которые были исправлены.
Это о лучшем, что вы можете получить. Главное, чтобы читатели держали свои замки в кратчайшие сроки.
Также обратите внимание, что ни ReaderWriterLock
, ни ReaderWriterLockSlim
поддержка межпроцессных замков.
Тонкая реализация не подходит для моего случая, так как мне нужно взаимодействие между процессами, но в отношении этой цитаты из документации, не в статье Джеффри Рихтера говорится об обратном? –
@Johnny_D 'ReaderWriterLock' тоже не поддерживает межпроцессорный материал, не так ли? Во всяком случае, кажется, что 'ReaderWriterLockSlim' действует иначе, чем' ReadwriterLock', таким образом, что он дает приоритеты писателям (я обновил свой ответ с этой информацией). –