Каковы различия между мьютексом, семафором и блокировкой записи?

Любые сценарии в режиме реального времени, поясняющие каждый, будут оценены. Есть ли другой способ обработки синхронизации, кроме этих в pthreads. Чем мьютекс отличается от рекурсивных мьютексов (любой сценарий в реальном времени)?

2 ответа

Мьютекс может использоваться для защиты общего ресурса (переменной, файла, периферийного устройства) от изменений, которые могут привести его в несогласованное состояние.

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

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

Условная переменная может использоваться вместе с мьютексом для сигнализации о событиях.

Википедия может быть использована, чтобы прочитать о большей части этого.

Это очень ясно ответил в boost::interprocess документы

Что такое мьютекс?

Mutex означает взаимное исключение и является самой основной формой синхронизации между процессами. Мьютексы гарантируют, что только один поток может заблокировать данный мьютекс. Если секция кода окружена блокировкой и разблокировкой мьютекса, гарантируется, что только секция кода одновременно выполняет эту секцию кода. Когда этот поток разблокирует мьютекс, другие потоки могут войти в эту область кода:

// Мьютекс был построен ранее

lock_the_mutex ();

// Этот код будет выполняться только одним потоком // одновременно.

unlock_the_mutex (); Мьютекс также может быть рекурсивным или нерекурсивным:

Рекурсивные мьютексы могут быть заблокированы несколько раз одним и тем же потоком. Чтобы полностью разблокировать мьютекс, поток должен разблокировать мьютекс так же, как он его заблокировал. Нерекурсивные мьютексы не могут быть заблокированы несколько раз одним и тем же потоком. Если мьютекс дважды блокируется потоком, результат не определен, это может привести к ошибке или поток может быть заблокирован навсегда. повысить межпроцессные документы

а также

Что такое семафор?

Семафор - это механизм синхронизации между процессами, основанный на внутреннем счетчике, который предлагает две основные операции:

Ожидание: проверка значения счетчика семафоров и ожидание, если значение меньше или равно 0. В противном случае уменьшается счетчик семафоров. Пост: увеличивает счетчик семафоров. Если какой-либо процесс заблокирован, один из этих процессов активируется. Если начальный счетчик семафоров инициализирован в 1, операция Wait эквивалентна блокировке мьютекса, а Post эквивалентна разблокировке мьютекса. Этот тип семафора известен как двоичный семафор.

Хотя семафоры могут использоваться как мьютексы, у них есть уникальная особенность: в отличие от мьютексов, операция Post не должна выполняться тем же потоком / процессом, который выполнил операцию Wait. boost:: interprocess docs

Boost Interprocess явно не имеет таких вещей, как блокировки чтения-записи, однако он реализует их, используя shared_locksи upgrade_lock а также upgrade_to_unique lock

Что такое Shatable и обновляемый Mutex?

Разделяемый и обновляемый мьютекс - это специальные типы мьютекса, которые предлагают больше возможностей блокировки, чем обычный мьютекс. Иногда мы можем различить чтение данных и изменение данных. Если только некоторые потоки нуждаются в изменении данных, и для защиты данных от одновременного доступа используется простой мьютекс, параллелизм довольно ограничен: два потока, которые только читают данные, будут сериализованы вместо одновременного выполнения.

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

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

Обновляемая блокировка. Получение обновляемой блокировки аналогично получению привилегированной разделяемой блокировки. Если поток получает обновляемую блокировку, другие потоки могут получить разделяемую блокировку. Если какой-либо поток получил исключительную или обновляемую блокировку, поток, пытающийся получить обновляемую блокировку, блокируется. Поток, получивший обновляемую блокировку, гарантированно сможет получить эксклюзивную блокировку, когда другие потоки, получившие разделяемую блокировку, снимают ее. Это используется для потока, который, возможно, должен изменить данные, но обычно просто должен прочитать данные. Этот поток получает обновляемую блокировку, а другие потоки могут получить разделяемую блокировку. Если обновляемый поток считывает данные и ему необходимо изменить их, поток может быть повышен до получения эксклюзивной блокировки: когда все разделяемые потоки сняли блокируемую блокировку, обновляемая блокировка автоматически превращается в эксклюзивную блокировку. Недавно продвинутый поток может изменять данные, и он может быть уверен, что ни один другой поток не изменил их при выполнении перехода. Только 1 поток может получить обновляемую блокировку (привилегированного читателя). повысить межпроцессные документы

Самого С ++ пока нет reader-writer locks (используя общие мьютексы), но @Howard Hinnet пытался их туда вставить, если вы посмотрите здесь, он также предоставляет код

Насколько я знаю, в C++ нет семафоров, и мьютексы есть только в новом стандарте C++11, что и объясняет, почему большая часть этого boost::interprocess

Другие вопросы по тегам