Шаг 118 - Функции CreateMutex() и ReleaseMutex()

Очень полезно сначала прочитать MSDN: "Шаг 82 - Что такое взаимоисключение (Mutex)". Создается Mutex функцией CreateMutex():

HANDLE CreateMutex
(
	LPSECURITY_ATTRIBUTES lpMutexAttributes,	// атрибут безопастности
	BOOL bInitialOwner,			// флаг начального владельца
	LPCTSTR lpName				// имя объекта
);

Результатом будет дескриптор объекта mutex, если такое имя есть, то дескпритор существующего. Функция GetLastError() при вызове будет выдавать ERROR_ALREADY_EXISTS.

Для освобождения объекта нужно вызвать функцию ReleaseMutex():

BOOL ReleaseMutex
(
	HANDLE hMutex	// дескриптор mutex
);

При успешном выполнении вернет ненулевое значение.

По окончанию дескриптор нужно закрыть вызвав CloseHandle(). Давайте посмотрим пример использования Mutex для запрета запуска двух приложений. Я упоминал об этом в API: "Шаг 42 - Виртуальная память".

// CreateMutex.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

void main()
{
	HANDLE mut;
	mut = CreateMutex(NULL, FALSE, "FirstStep");
	DWORD result;
	result = WaitForSingleObject(mut,0);
	if (result == WAIT_OBJECT_0) 
	{
		cout << "programm running" << endl;
		int i;
		cin >> i;
		ReleaseMutex(mut);
	}
	else
		cout << "fail programm running" << endl;
	CloseHandle(mut);
}

При запуске программы она создает объект с именем "FirstStep", если захватить его удается WaitForSingleObject(), то программа выполняется якобы, ждет пока Вы введете число и нажмете Enter. Если захватить его не удается, то выходит с надписью fail. Если Вы попробуете, то Вы сможете запустить только одну копию.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 6.05.2001