Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CloseHandle() не снимает блокировку именованного мутекса / 10 сообщений из 10, страница 1 из 1
26.10.2017, 09:34
    #39542164
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CloseHandle() не снимает блокировку именованного мутекса
Наткнулся на интересную багофичу виндовса: если заблокировать мутекс и сделать 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
26.10.2017, 09:46
    #39542173
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CloseHandle() не снимает блокировку именованного мутекса
Никогда с таким не работал, решил почитать доку. В 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
26.10.2017, 10:16
    #39542196
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CloseHandle() не снимает блокировку именованного мутекса
Dima T, подозреваю, что CloseHandle() слишком "широкая" по применению в разных местах функция, чтобы делать все проверки и освобождать/отпускать все ресурсы, которые теоретически могут скрываться в HANDLE
...
Рейтинг: 0 / 0
26.10.2017, 10:44
    #39542208
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CloseHandle() не снимает блокировку именованного мутекса
Еще потестил. Если после CloseHandle(mtx) снова открыть, то можно разблокировать
Код: plaintext
1.
2.
3.
4.
...
	HANDLE mtx2 = CreateMutex(0, 0, "Test_mutex");
	ReleaseMutex(mtx2);
...



Похоже так задумано.
...
Рейтинг: 0 / 0
26.10.2017, 10:49
    #39542213
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CloseHandle() не снимает блокировку именованного мутекса
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
26.10.2017, 12:20
    #39542334
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CloseHandle() не снимает блокировку именованного мутекса
Dima TЯ о другом, считал что CloseHandle() что-то типа деструктора, т.е. если блокировка стоит, то ReleaseMutex() сделает. Оказалось что не так все, надо явно вызывать ReleaseMutex().
Это как раз нелогично.
По такой логике, только что открытый объект мьютекса должен быть всегда разблокированным, но тогда смысл в именованных мьютексах пропадает.
...
Рейтинг: 0 / 0
26.10.2017, 12:37
    #39542353
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CloseHandle() не снимает блокировку именованного мутекса
Anatoly MoskovskyDima TЯ о другом, считал что CloseHandle() что-то типа деструктора, т.е. если блокировка стоит, то ReleaseMutex() сделает. Оказалось что не так все, надо явно вызывать ReleaseMutex().
Это как раз нелогично.
По такой логике, только что открытый объект мьютекса должен быть всегда разблокированным, но тогда смысл в именованных мьютексах пропадает.
Странный вывод.

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

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

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


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