Простое мьютексное приложение не работает правильно? - PullRequest
0 голосов
/ 19 апреля 2019

Рассмотрим этот код:

#include  <Windows.h>

test(HANDLE*hB0)
{
    printf("hello "), ReleaseMutex(*hB0);
}
main()
{
    HANDLE hB0;
        CreateThread(0,0,test,(hB0=CreateMutex(NULL,true,NULL),&hB0),0,0),
        WaitForSingleObject(hB0, INFINITE),
        printf("world!");
}

Я ожидаю привет, мир!но я просто получаю мир!вместо.Любые идеи, почему?

Я пытался с помощью второго параметра CreateMutex и истина и ложь, но он все еще не работает.

1 Ответ

3 голосов
/ 19 апреля 2019

из 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 для обработки.

...