- Мьютекс
-
Мью́текс (англ. mutex, от mutual exclusion — «взаимное исключение») — одноместный семафор, служащий в программировании для синхронизации одновременно выполняющихся потоков.
Мьютексы — это один из вариантов семафорных механизмов для организации взаимного исключения. Они реализованы во многих ОС, их основное назначение — организация взаимного исключения для потоков из одного и того же или из разных процессов.
Мьютексы — это простейшие двоичные семафоры, которые могут находиться в одном из двух состояний — отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта mutex, последний переводится в неотмеченное состояние. Если задача освобождает мьютекс, его состояние становится отмеченным.
Задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом. В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом. Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток засыпает до тех пор, пока мьютекс не будет освобождён.
Цель использования мьютексов — защита данных от повреждения; однако им порождаются другие проблемы — такие, как взаимная блокировка (клинч) и состояние гонки.
Мьютекс отличается от спинлока наличием очереди ожидающих потоков.
Содержание
Мьютексы в Win32 API
Win32 API в Windows имеет две реализации мьютексов — собственно мьютексы[1], имеющие имена и доступные для использования между разными процессами, и критические секции[2], которые могут использоваться только в пределах одного процесса. Для каждого из этих двух типов мьютексов используются свои функции захвата и освобождения.
Критическая секция в Windows по возможности блокируется без использования вызова режима ядра (аналогично спинлоку), но при невозможности такой блокировки поток запрашивает ядро.
Мьютексы в Unix-подобных системах
Мьютекс в стандартной библиотеке Pthreads может использоваться в одном процессе или в разных, но в любом случае всем использующим процессам требуется доступ к памяти, в которой он размещён. Такой мьютекс может иметь один из следующих типов[3]:
- PTHREAD_MUTEX_NORMAL — нет контроля повторного захвата тем же потоком (англ. thread)
- PTHREAD_MUTEX_RECURSIVE — повторные захваты тем же потоком допустимы, ведётся счётчик таких захватов
- PTHREAD_MUTEX_ERRORCHECK — повторные захваты тем же потоком вызывают немедленную ошибку
Примечания
- ↑ Create Mutex. Архивировано из первоисточника 14 февраля 2012.
- ↑ Critical sections. Архивировано из первоисточника 14 февраля 2012.
- ↑ pthread_mutexattr_settype(3). Архивировано из первоисточника 14 февраля 2012.
См. также
- Многопоточность
- Фьютекс, быстрый пользовательский мьютекс
Межпроцессное взаимодействие в информатике Методы Файл · Memory-mapped file · Обмен сообщениями · Message queue and mailbox · Именованный канал · Anonymous pipe · Pipe · Семафор (критическая секция, мьютекс, фьютекс) · Shared memory · Сигнал · Сокет · Unix domain socket Избранные протоколы
и стандартыApple events · COM+ · CORBA · D-Bus · DCE · DCOP · DIPC · ICE · LINX · ONC RPC · POSIX (различные методы) · SOAP · Thrift · TIPC · XML-RPC Для улучшения этой статьи желательно?: - Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
- Переработать оформление в соответствии с правилами написания статей.
- Добавить иллюстрации.
Это заготовка статьи о компьютерах. Вы можете помочь проекту, исправив и дополнив её.
Это примечание по возможности следует заменить более точным.Категория:- Управление конкурентными потоками
Wikimedia Foundation. 2010.