powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CloseHandle() не снимает блокировку именованного мутекса
10 сообщений из 10, страница 1 из 1
CloseHandle() не снимает блокировку именованного мутекса
    #39542164
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся на интересную багофичу виндовса: если заблокировать мутекс и сделать CloseHandle() то он не разблокируется до завершения процесса.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <windows.h>
#include <stdio.h>

int main(int argc, char** argv[])
{
	printf("%09d: CreateMutex()\n", GetTickCount());
	HANDLE mtx = CreateMutex(0, 0, "Test_mutex");
	if (mtx != NULL) {
		printf("%09d: WaitForSingleObject()\n", GetTickCount());
		WaitForSingleObject(mtx, INFINITE);
		printf("%09d: Lock\n", GetTickCount());
		system("pause");
		printf("%09d: CloseHandle()\n", GetTickCount());
		if(!CloseHandle(mtx)) printf("%09d: CloseHandle() error\n", GetTickCount());
	}
	printf("%09d: Sleep()\n", GetTickCount());
	Sleep(2000);
	printf("%09d: end\n", GetTickCount());
	return 0;
}


Первый процесс:
Код: plaintext
1.
2.
3.
4.
5.
6.
041522109: CreateMutex()
041522109: WaitForSingleObject()
041522109: Lock
Для продолжения нажмите любую клавишу . . .
041539515: CloseHandle()
041539515: Sleep()
041541515: end

Второй процесс:
Код: plaintext
1.
2.
041534125: CreateMutex()
041534125: WaitForSingleObject()
041541515: Lock
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542173
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда с таким не работал, решил почитать доку. В MSDN английскими буквами по белому написано:

Only one thread can own a mutex at any given time. The owning thread uses the ReleaseMutex function to release its ownership.
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542196
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, подозреваю, что CloseHandle() слишком "широкая" по применению в разных местах функция, чтобы делать все проверки и освобождать/отпускать все ресурсы, которые теоретически могут скрываться в HANDLE
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542208
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще потестил. Если после CloseHandle(mtx) снова открыть, то можно разблокировать
Код: plaintext
1.
2.
3.
4.
...
	HANDLE mtx2 = CreateMutex(0, 0, "Test_mutex");
	ReleaseMutex(mtx2);
...



Похоже так задумано.
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542213
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevНикогда с таким не работал, решил почитать доку. В MSDN английскими буквами по белому написано:

Only one thread can own a mutex at any given time. The owning thread uses the ReleaseMutex function to release its ownership.

Это понятно.
Я о другом, считал что CloseHandle() что-то типа деструктора, т.е. если блокировка стоит, то ReleaseMutex() сделает. Оказалось что не так все, надо явно вызывать ReleaseMutex().
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542334
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ о другом, считал что CloseHandle() что-то типа деструктора, т.е. если блокировка стоит, то ReleaseMutex() сделает. Оказалось что не так все, надо явно вызывать ReleaseMutex().
Это как раз нелогично.
По такой логике, только что открытый объект мьютекса должен быть всегда разблокированным, но тогда смысл в именованных мьютексах пропадает.
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542353
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDima TЯ о другом, считал что CloseHandle() что-то типа деструктора, т.е. если блокировка стоит, то ReleaseMutex() сделает. Оказалось что не так все, надо явно вызывать ReleaseMutex().
Это как раз нелогично.
По такой логике, только что открытый объект мьютекса должен быть всегда разблокированным, но тогда смысл в именованных мьютексах пропадает.
Странный вывод.

ReleaseMutex() не освобождает мутекс захваченный другим потоком.
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542383
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя может быть столько хэндлов одного и того же мутекса, сколько пожелаешь.
Освобождение мутекса при закрытии любого из них сделает поведение программы непредсказуемо
нестабильным.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542400
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CloseHandle() не изменяет состояние объекта, оно всего лишь уничтожает одну ссылку на
него. Состояние объекта может измениться автоматически разве что когда количество ссылок
на него достигнет нуля. Объект при этом уничтожается. Что может повлечь за собой и другое
действие. Файл, например, при этом закрывается.

Раз уж мы в разделе С++, можешь думать об этом так: Handle это shared_pointer и
уничтожение одного из них не вызывает автоматического срабатывания деструктора объекта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
CloseHandle() не снимает блокировку именованного мутекса
    #39542460
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ о другом, считал что CloseHandle() что-то типа деструктора, т.е. если блокировка стоит, то ReleaseMutex() сделает. Оказалось что не так все, надо явно вызывать ReleaseMutex().

CloseHandle() это не типа деструктора, а типа Release() в COM. (который из IUnknown)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CloseHandle() не снимает блокировку именованного мутекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]