из CreateMutex
функция
Поток, которому принадлежит мьютекс, может указать тот же мьютекс в повторном
ожидание вызова функции без блокировки ее выполнения
в вызове
hB0=CreateMutex(NULL,true,NULL)
bInitialOwner = TRUE
, так что ваш текущий поток владеет мьютексом, в результате WaitForSingleObject(hB0, INFINITE)
просто возвращается без блокировки выполнения.
с другой стороны, если поток, который не владеет мьютексом, вызовет ReleaseMutex
- будет возвращена ошибка ERROR_NOT_OWNER
- Попытка освободить мьютекс, не принадлежащий вызывающей стороне. или собственный статус STATUS_MUTANT_NOT_OWNED
Попытка освободить объект-мутант была предпринята потоком, который не был владельцем объекта-мутанта. - но вы не проверяли результат функции и код ошибки.
также потому, что вы определяете test(HANDLE*hB0)
- вам нужно позвонить ReleaseMutex(*hB0);
вместо ReleaseMutex(hB0);
. однако лучше передать hB0
дескриптор непосредственно потоку в качестве аргумента, вместо указателя &hB0
для обработки.