Мне нужна полностью рекурсивная блокировка нескольких читателей / единственных писателей (общий мьютекс) для моего проекта - я не согласен с тем, что если у вас полная корректность констант, вам они не нужны (там было некоторые обсуждения этого в списке рассылки boost), в моем случае блокировка должна защищать полностью прозрачный кеш, который в любом случае будет изменяемым.
Что касается семантики рекурсивных блокировок MRSW, я думаю, что единственные, которые имеют смысл, - это то, что получение эксклюзивной блокировки в дополнение к общей временно освобождает общую блокировку, которая должна быть повторно получена при освобождении исключительной блокировки.
Имеет несколько странный эффект, что разблокировка может подождать, но я могу с этим смириться - запись редко происходит в любом случае, а рекурсивная блокировка обычно происходит только через пути рекурсивного кода, и в этом случае вызывающая сторона должна быть готова к тому, что вызов может ждать в любом случае. дело. Чтобы избежать этого, все равно можно просто обновить блокировку вместо использования рекурсивной блокировки.
Получение общей блокировки поверх эксклюзивной, очевидно, просто увеличивает количество блокировок.
Таким образом, возникает вопрос - как мне это реализовать? Обычный подход с критическим разделом и двумя семафорами здесь не работает, потому что, насколько я вижу, проснувшийся поток должен рукопожатие, вставив свой идентификатор потока в карту владельца замка.
Полагаю, это было бы выполнимо с двумя условными переменными и парой мьютексов, но с огромным количеством примитивов синхронизации, которые в конечном итоге использовали бы звуки, слишком большие для моего вкуса.
Идея, которая пришла мне в голову, состоит в том, чтобы использовать TLS, чтобы запомнить тип блокировки, которую я держу (и, возможно, количество локальных блокировок). Надо обдумать это - но я все еще отправлю вопрос на данный момент.
Целевой платформой является Win32, но это не должно иметь большого значения. Обратите внимание, что я специально нацеливаюсь на Win2k, поэтому все, что связано с новым примитивом блокировки MRSW в Windows 7, не имеет значения для меня. : -)