Вопрос по condition-variable, c++, c++11, multithreading, mutex – Различия между условными переменными, мьютексами и замками

44

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

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

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

Ваш Ответ

2   ответа
5

так что возьми этот ответ без малейшей соли.

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

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

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

65

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

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

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

Сама часть недостающей документации. Благодарность spacediver
@ hydroes: нет. Если поток1 ожидает блокировки, то другой поток должен его удерживать, чтобы поток1 оставался заблокированным. Как только этот другой поток освобождает его, thread1 может разблокировать его, чтобы получить мьютекс. С помощью условной переменной любой поток может сигнализировать, чтобы разблокировать официанта (ов), а не только какой-то специальный поток, который все время удерживал блокировку. Кроме того, вы можете передать условную переменную, чтобы освободить все ожидающие потоки. Steve Jessop
Разве ожидание (thread1) + сигнализация (thread2) с конваками точно такое же, как блокировка (thread1) + разблокировка (thread2)? Ronny Brendel

Похожие вопросы