В чем разница между unique_lock и shared_lock в C ++ - PullRequest
2 голосов
/ 04 августа 2020

Пытаюсь понять, когда можно использовать shared_lock вместо unique_lock или наоборот. C ++ do c очень криптографический c! Я знаю, что общее правило - использовать lock_guard вместо двух, если мы желаем немедленного взаимного исключения с ограниченным объемом (или RAII).

Имеет ли это какое-то отношение к condition_variable? Если я правильно помню, я видел, как все три использовались с этим.

Я видел вопрос о переполнении стека, который похож, но избегает ответа на этот вопрос здесь: { ссылка }: ~: text = lock_shared ()% 20is% 20a% 20function,% 20end% 20of% 20the% 20scope .

1 Ответ

3 голосов
/ 04 августа 2020

Это действительно очень просто. unique_lock вызывает lock() на мьютексе. shared_lock вызывает shared_lock().

Разница между ними в том, что shared_lock предназначен для поддержки считывателей в блокировке чтения / записи. У вас может быть несколько потоков, которые получают общую блокировку и читают одни и те же данные, но если кто-то хочет записать в данные, им нужно использовать lock, чтобы получить разрешение на запись в данные.

Какой именно что вы должны использовать, зависит от шаблона, который вы ищете. Во многих случаях требуется блокировка чтения / записи (поэтому стандарт включает их поддержку). Бывают случаи, когда требуется простой уникальный мьютекс. В общем, если чтение и запись являются для вас значимыми понятиями, есть большая вероятность, что мьютекс чтения / записи, такой как shared_timed_mutex, будет правильным подходом.

...