TMREWSyn c (TMultiReadExclusiveWriteSynchronizer) вопросы - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть вопросы по поводу TMREWSyn c:

  1. Можно ли обновить блокировку чтения до блокировки записи без разблокировки?

  2. Дон не понимаю, что мне делать, если BeginWrite возвращает false?

Ответы [ 2 ]

2 голосов
/ 07 марта 2020
  1. Да, TMREWSyn c поддерживает обновления блокировки. Используйте это как: BeginRead ... BeginWrite ... EndWrite ... EndRead.

  2. Исходный код в System.SysUtils состояниях:

Результат функции BeginWrite указывает, получила ли другая нить блокировку записи, в то время как текущая нить ожидала блокировки записи. Возвращаемое значение True означает, что блокировка записи была получена без каких-либо промежуточных изменений другими потоками. Возвращаемое значение False означает, что другой поток получил блокировку записи во время ожидания, поэтому ресурс, защищенный объектом MREWS, следует считать модифицированным. Любые образцы защищенного ресурса должны быть отброшены.

Я предлагаю вам написать свой алгоритм, чтобы он не зависел от этого возвращаемого значения. Исходный код согласен со мной:

В общем случае лучше всегда всегда повторно запрашивать образцы защищенного ресурса после получения блокировки записи. Логический результат свойства BeginWrite и свойства RevisionLevel помогает в случаях, когда повторный запрос выборок является вычислительно дорогим или трудоемким.

1 голос
/ 29 февраля 2020

Такое обновление обычно не легкое. Рассмотрим два потока чтения, пытающихся обновиться одновременно. Это было бы тупиком.

Одно из решений состоит в том, чтобы сделать один (и не более одного) читателей обновляемыми с самого начала, а другие - нет. boost::upgrade_mutex является примером. Другое может заключаться в том, что обновление может завершиться неудачей, и в этом случае для обновления требуется снять блокировку считывателя без повторных попыток. Все это не намного лучше, чем просто разблокировать и заново получить блокировку писателя.

Я считаю, что большую часть времени вас не волнует возвращаемое значение BeginWrite. Большинство других реализаций общего мьютекса не возвращают это значение.

(Я полагаю, что вопрос помечен WinAPI неправильно. Существует Блокировка SRW , но она отличается от TMREWSyn c)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...