У меня возникают проблемы с блокировкой в моей программе. Поэтому я читал о блокировках, но проблема в большей части информации не соответствует или не определена платформой. В Recursive Lock (Mutex) vs Non-Recursive Lock (Mutex) наиболее общепринятый ответ говорит:Рекурсивные и нерекурсивные блокировки (Mutex)
Поскольку рекурсивный мьютекс имеет смысл собственности, поток, который захватывает мьютекс должен быть тот же поток, который освобождает семафор. В случае с нерекурсивными мьютексами нет никакого смысла владения, и любая нить обычно может отпускать мьютексы независимо от того, какой поток изначально был назначен . Во многих случаях этот тип «мьютекса» на самом деле является более чем действием семафора, где вы не обязательно используете мьютекс как устройство исключения, но используете его как устройство синхронизации или сигнализации между двумя или более потоками.
В комментариях люди говорят, что это неверно, и об этом нет. Итак ...
1) Если я заблокирую нерекурсивный мьютекс в потоке A. Может ли резьба B разблокировать ее, не захватывая замок?
2) Если в блокировке был сделан нерекурсивный мьютекс потоком A и потоком B, чтобы получить блокировку, поток B будет ждать, пока блокировка не будет отпущена, чтобы получить блокировку или выкинет исключение ? Как насчет этого случая в рекурсивном мьютексе? (Также обсуждались в других вопросах, где нельзя было сделать достойное заключение)
3) При использовании рекурсивных замков при завершении процесса необходимо ли освободить все рекурсивные блокировки? (В зависимости от того, заканчивается ли процесс)
4) С какими проблемами я сталкиваюсь при использовании комбинации рекурсивных и нерекурсивных замков с осторожностью?
PS: Использование только оконной платформы и std::thread
.
_The принял ответ неверен, или, по крайней мере, объясняет свою точку очень, очень poorly._ It кажется, ваш принятый в настоящее время ответ мог использовать охранник. – bvj