2016-01-21 2 views
6

Интересно, почему я не могу сделать это в C++ 14 (или 17)Состояние переменной и общий мьютекс

std::shared_timed_mutex mutex; 
std::unique_lock<std::shared_timed_mutex> lock(mutex); 

std::condition_variable var; 

while(!some_condition) 
    var.wait(lock); 

Переменные условия кажутся только для работы с станд :: мьютекс. Но почему?

+0

Вы можете поделиться с вами своим дефолтом? – inf

+0

Что круто, так это то, что вы можете не только ждать «shared_timed_mutex», который «записывается заблокирован», как показано выше, вы также можете подождать, пока он «будет заблокирован», используя «shared_lock». Возможно, вам нужно подождать, пока поток писателя обновит информацию, чтобы вы могли ее опубликовать. –

+0

Случай использования немного сложный: у меня есть хранилище данных с глобальным (на данный момент) блокировкой чтения/записи. А также блокировки для каждого объекта. Если я приобретаю объект, я сначала блокирую глобальную блокировку, извлекаю объект, блокирую объект, а затем отключаю глобальную блокировку. Теперь может быть случай, когда объект удаляется. Поэтому я не хочу ждать блокировки объекта (потому что эта блокировка тоже будет уничтожена), но вместо этого имеет переменную условия, которая просыпает пробуждение потоков, когда что-то меняется. Возможно, это не лучший дизайн, но он свободен от тупиков и не использует много памяти. –

ответ

9

Это определено стандартом, обеспечивающим максимальную эффективность реализации. Если вы хотите использовать другой замок с condition_variable, вам нужно использовать condition_variable_any. Обратите внимание, что реализация condition_variable_any имеет некоторые накладные расходы.

Цитата стандарта: 30.5 Переменные условия

Класс condition_variable обеспечивает переменную состояния, которое можно только ждать на объект типа unique_lock<mutex>, что позволяет максимально Effciency на некоторых платформах.

+0

Большое вам спасибо! Я не знал, что это существовало! –

+0

@ T.C. Спасибо, просто пытался выяснить, как сделать эту работу :) – inf

Смежные вопросы