2013-10-24 2 views
0

Я довольно смущен необходимостью std::unique_lock, когда вы ждете std::conditional_variable. Поэтому я просматриваю код библиотеки в VS 2013 и больше запутался. Это как std::conditional_variable::wait() реализовано:Какова задача std :: unique_lock при использовании с std :: conditional_variable :: wait()

void wait(unique_lock<mutex>& _Lck) 
    { // wait for signal 
    _Cnd_waitX(&_Cnd, &_Lck.mutex()->_Mtx); 
    } 

Это какая-то шутка? Оберните мьютексы в уникальном_блоке и ничего не делайте, но верните его назад? Почему бы просто не использовать мьютексы в списке параметров?

+1

Возможно, вы захотите прочитать этот вопрос http://stackoverflow.com/q/2763714, он специфичен для pthread, но относится и к этому случаю. – Hasturkun

ответ

3

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

+1

Что делать, если эта переменная имеет атомный тип? –

+0

Это хороший вопрос. У меня нет ответа на это. –

+2

@Mike: Вам все равно понадобится мьютекс. Изменение состояния может быть атомарным; но действия, которые вам нужны для атома, - это «изменять и уведомлять» и «проверять и ждать». В противном случае вы можете ждать всегда, если уведомление произойдет после того, как вы проверили значение, но до того, как вы начнете ждать. –

0

Проблема в том, что когда вы просыпаетесь после того, как получили сигнал, вам необходимо уже заблокировать мьютекс. Если вы попытаетесь заблокировать мьютекс после просыпания по сигналу, вы получите условие гонки. С другой стороны, ожидание переменной условия не может заблокировать этот мьютекс сам по себе, поскольку он не сможет правильно вернуть вам блокировку, и обычно вы должны заблокировать мьютекс, прежде чем вы все равно в ожидании.

+0

Можете ли вы объяснить, какое состояние гонки вы имеете в виду? –

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