Различия между условными переменными, мьютексами и замками - PullRequest
45 голосов
/ 28 июня 2009

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

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

Заранее спасибо.

Ответы [ 2 ]

67 голосов
/ 28 июня 2009

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

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

5 голосов
/ 28 июня 2009

Я не слишком знаком с C ++ 0x, поэтому возьмите этот ответ с небольшим количеством соли.

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

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

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

...