Подтвердить что ты не робот

Различия между условными переменными, мьютексами и замками

Например, С++ 0x интерфейсы

Мне сложно определить, когда использовать какую из этих вещей (cv, mutex и lock). Может кто-нибудь объяснить или указать ресурс?

Спасибо заранее.

4b9b3361

Ответ 1

На странице, на которую вы ссылаетесь, "mutex" - это фактический примитив синхронизации низкого уровня. Вы можете принять мьютекс, а затем отпустить его, и только один поток может взять его в любой момент (следовательно, это примитив синхронизации). Рекурсивный мьютекс - это тот, который может быть взят одним и тем же потоком несколько раз, а затем он должен быть выпущен столько раз одним и тем же потоком, прежде чем другие смогут его принять.

"Блокировка" здесь - это просто класс оболочки С++, который принимает мьютекс в своем конструкторе и выпускает его в деструкторе. Это полезно для установки синхронизации для областей С++.

Переменная состояния - это более продвинутая/высокоуровневая форма синхронизирующего примитива, которая объединяет блокировку с механизмом "сигнализации". Он используется, когда потоки должны ждать, пока ресурс станет доступным. Поток может "ждать" на CV, а затем производитель ресурсов может "сигнализировать" эту переменную, и в этом случае потоки, ожидающие резюме, получат уведомление и могут продолжить выполнение. Мьютекс сочетается с CV, чтобы избежать состояния гонки, когда нить начинает ждать на CV, в то время как другой поток хочет сигнализировать об этом; то он не контролируется, будет ли сигнал доставлен или потерян.

Ответ 2

Я не слишком хорошо знаком с С++ 0x, поэтому возьмите этот ответ со слоем соли.

re: Mutex vs. locks: из размещенной вами документации выглядит, что mutex - это объект, представляющий мьютекс OS, тогда как lock - это объект, который содержит мьютекс, чтобы облегчить шаблон RAII.

Переменные условия являются удобным механизмом для связывания механизма блокировки/сигнализации (сигнал + ожидание) с механизмом взаимного исключения, но сохраняют их развязанными в ОС, так что вы, как системный программист, можете выбирать связь между condvar и мьютексом. (полезно для работы с несколькими наборами одновременно доступных объектов). Rob Krten имеет некоторые хорошие объяснения по condvars в одном из онлайновых разделов его книга в QNX.

Что касается общих ссылок: Эта книга (еще не пока) выглядит интересной.