Например, С++ 0x интерфейсы
Мне сложно определить, когда использовать какую из этих вещей (cv, mutex и lock). Может кто-нибудь объяснить или указать ресурс?
Спасибо заранее.
Например, С++ 0x интерфейсы
Мне сложно определить, когда использовать какую из этих вещей (cv, mutex и lock). Может кто-нибудь объяснить или указать ресурс?
Спасибо заранее.
На странице, на которую вы ссылаетесь, "mutex" - это фактический примитив синхронизации низкого уровня. Вы можете принять мьютекс, а затем отпустить его, и только один поток может взять его в любой момент (следовательно, это примитив синхронизации). Рекурсивный мьютекс - это тот, который может быть взят одним и тем же потоком несколько раз, а затем он должен быть выпущен столько раз одним и тем же потоком, прежде чем другие смогут его принять.
"Блокировка" здесь - это просто класс оболочки С++, который принимает мьютекс в своем конструкторе и выпускает его в деструкторе. Это полезно для установки синхронизации для областей С++.
Переменная состояния - это более продвинутая/высокоуровневая форма синхронизирующего примитива, которая объединяет блокировку с механизмом "сигнализации". Он используется, когда потоки должны ждать, пока ресурс станет доступным. Поток может "ждать" на CV, а затем производитель ресурсов может "сигнализировать" эту переменную, и в этом случае потоки, ожидающие резюме, получат уведомление и могут продолжить выполнение. Мьютекс сочетается с CV, чтобы избежать состояния гонки, когда нить начинает ждать на CV, в то время как другой поток хочет сигнализировать об этом; то он не контролируется, будет ли сигнал доставлен или потерян.
Я не слишком хорошо знаком с С++ 0x, поэтому возьмите этот ответ со слоем соли.
re: Mutex vs. locks: из размещенной вами документации выглядит, что mutex
- это объект, представляющий мьютекс OS, тогда как lock
- это объект, который содержит мьютекс, чтобы облегчить шаблон RAII.
Переменные условия являются удобным механизмом для связывания механизма блокировки/сигнализации (сигнал + ожидание) с механизмом взаимного исключения, но сохраняют их развязанными в ОС, так что вы, как системный программист, можете выбирать связь между condvar и мьютексом. (полезно для работы с несколькими наборами одновременно доступных объектов). Rob Krten имеет некоторые хорошие объяснения по condvars в одном из онлайновых разделов его книга в QNX.
Что касается общих ссылок: Эта книга (еще не пока) выглядит интересной.