Поделиться через


Класс CMutex

Представляет объект синхронизации, который позволяет одному потоку взаимоисключающий доступ к ресурсу.

Синтаксис

class CMutex : public CSyncObject

Участники

Открытые конструкторы

Имя Описание
CMutex::CMutex Формирует объект CMutex.

Замечания

Мьютексы полезны, если только один поток за раз может изменять данные или другой управляемый ресурс. Например, добавление узлов в связанный список — это процесс, который должен быть разрешен только одним потоком одновременно. С помощью объекта для управления связанным списком CMutex только один поток за раз может получить доступ к списку.

Чтобы использовать CMutex объект, создайте CMutex объект при необходимости. Укажите имя мьютекса, на которое вы хотите ждать, и что приложение должно изначально владеть им. После этого можно получить доступ к мьютексу при возврате конструктора. Вызовите CSyncObject::Разблокируйте , когда вы закончите доступ к управляемому ресурсу.

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

Чтобы получить доступ к ресурсам, контролируемым CMutex объектами таким образом, сначала создайте переменную типа CSingleLock или тип CMultiLock в функции-члене ресурса. Затем вызовите функцию-член объекта Lock блокировки (например, CSingleLock::Lock). На этом этапе поток получит доступ к ресурсу, подождите, пока ресурс будет освобожден и получите доступ, или дождитесь освобождения ресурса и истечения времени ожидания, не получая доступа к ресурсу. В любом случае ресурс был доступ к ресурсу в потокобезопасном режиме. Чтобы освободить ресурс, используйте функцию-член объекта Unlock блокировки (например, CSingleLock::Unlock) или разрешите объекту блокировки выйти из область.

Дополнительные сведения об использовании CMutex объектов см. в статье "Многопоточность: использование классов синхронизации".

Иерархия наследования

CObject

CSyncObject

CMutex

Требования

Заголовок: afxmt.h

CMutex::CMutex

Создает именованный или неименованный CMutex объект.

CMutex(
    BOOL bInitiallyOwn = FALSE,
    LPCTSTR lpszName = NULL,
    LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);

Параметры

bInitiallyOwn
Указывает, имеет ли поток, создающий CMutex объект, доступ к ресурсу, управляемому мьютексом.

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

lpsaAttribute
Атрибуты безопасности для объекта мьютекса. Полное описание этой структуры см. в SECURITY_ATTRIBUTES в пакете SDK для Windows.

Замечания

Чтобы получить доступ к объекту CMutexили освободить его, создайте объект CMultiLock или CSingleLock и вызовите функции-члены блокировки и разблокировки. CMutex Если объект используется автономно, вызовите ее Unlock функцию-член, чтобы освободить ее.

Важно!

После создания CMutex объекта используйте GetLastError , чтобы убедиться, что мьютекс еще не существовал. Если мьютекс существовал неожиданно, он может указать, что процесс изгоя скватируется и может намереваться использовать мьютекс злонамеренно. В этом случае рекомендуется закрыть дескриптор и продолжить, как если бы при создании объекта произошел сбой.

См. также

Класс CSyncObject
Диаграмма иерархии