Класс 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
объектов см. в статье "Многопоточность: использование классов синхронизации".
Иерархия наследования
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 , чтобы убедиться, что мьютекс еще не существовал. Если мьютекс существовал неожиданно, он может указать, что процесс изгоя скватируется и может намереваться использовать мьютекс злонамеренно. В этом случае рекомендуется закрыть дескриптор и продолжить, как если бы при создании объекта произошел сбой.