Как проверить существование мьютекса
у меня есть две программы в первой создаёться мьютекс
int main()
{
HANDLE mutex = CreateMutexA(NULL, NULL, "MutexName");
DWORD result = WaitForSingleObject(mutex, 0);
if(result == WAIT_OBJECT_0)
{
StartProg();
ReleaseMutex(mutex);
}
CloseHandle(mutex);
}
Мне нужно что-бы при запуске второй программы она проверяла существование мьютекса из первой программы по имени т.е. проверила запущен ли мьютекс с именем MutexName и если запущен то ждать пока освободиться и продолжить своё выполнение. Как мне это сделать?
Ответы (2 шт):
Вторым аргументов в этой функции выступает флаг обязательности создания объекта. Соответственно для получения желаемого эффекта необходимо попытаться создать объект в обязательном порядке:
LPSECURITY_ATTRIBUTES const p_attributes{};
BOOL const initial{TRUE};
HANDLE const mutex{::CreateMutexA(p_attributes, initial, "MutexName")};
if (NULL == mutex)
{
auto const last_error{::GetLastError()};
::std::abort();
}
{
auto const last_error{::GetLastError()};
if (ERROR_ALREADY_EXISTS == last_error)
{
// мьютекс уже был создан ранее, ждем...
auto const result{::WaitForSingleObject(mutex, INFINITE)};
}
if (FALSE == ::CloseHandle(mutex))
{
auto const last_error{::GetLastError()}:
::std::abort();
}
Функция CreateMutexA может создать или октрыть существующий мьютекс.
Отличить создала она мьютекс или открыла можно по ::GetLastError().
Один из редких случаев, когда результат, возвращаемый ::GetLastError() определён для успешно выполнившейся Windows API функции (обычно он валиден только для неуспешных вызовов).