Mutex

Наследует: RefCounted < Object

Двоичный Semaphore для синхронизации нескольких Thread-ов.

Описание

Синхронизирующий мьютекс (взаимное исключение). Используется для синхронизации нескольких Thread и эквивалентен двоичному Semaphore. Он гарантирует, что только один поток может получить доступ к критическому разделу одновременно.

Это реентерабельный мьютекс, то есть он может быть заблокирован несколько раз одним потоком, при условии, что он также разблокирует его столько же раз.

Предупреждение: Мьютексы следует использовать осторожно, чтобы избежать взаимоблокировок.

Предупреждение: Чтобы обеспечить надлежащую очистку без сбоев или взаимоблокировок, должны быть выполнены следующие условия:

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

  • Когда счетчик ссылок Thread достигает нуля и, следовательно, он уничтожается, у него не должно быть заблокированных мьютексов.

Обучающие материалы

Методы

void

lock()

bool

try_lock()

void

unlock()


Описания метода

void lock() 🔗

Блокирует этот Mutex, блокирует до тех пор, пока он не будет разблокирован текущим владельцем.

Примечание: Эта функция возвращает без блокировки, если поток уже владеет мьютексом.


bool try_lock() 🔗

Пытается заблокировать этот Mutex, но не блокирует. Возвращает true в случае успеха, false в противном случае.

Примечание: Эта функция возвращает true, если поток уже владеет Mutex.


void unlock() 🔗

Разблокирует этот Mutex, оставляя его другим потокам.

Примечание: Если поток вызвал lock() или try_lock() несколько раз, уже владея мьютексом, он также должен вызвать unlock() столько же раз, чтобы правильно разблокировать его.

Предупреждение: Вызов unlock() больше раз, чем lock() в данном потоке, в результате чего происходит попытка разблокировать незаблокированный мьютекс, является неправильным и может привести к сбоям или взаимоблокировкам.