Если поток блокирует мьютекс и не разблокирует его, не должны ли блокироваться остальные потоки? - PullRequest
3 голосов
/ 29 марта 2019

Результат кода ниже 4000;почему это 4000, если поток, у которого есть мьютекс, не освобождает его.Я думаю, что это будет тупик, в основном я жду завершения всех функций.

int M = 1000;
HANDLE mutex;
DWORD WINAPI thread_function(LPVOID param) // The thread function
{
    long aux;
    WaitForSingleObject(mutex, INFINITE);
    for (int i = 0; i < M; i++)
    {
        aux = count;         //count is global
        aux++;
        Sleep(0.5);
        count = aux;
    }
    /*ReleaseMutex(mutex);*/
    return (DWORD)0;
}
int main()
{
    int N = 4;
    InitializeCriticalSection(&gSection);
    HANDLE* iThread = (HANDLE*)malloc(N * sizeof(HANDLE));
    mutex = CreateMutex(NULL, FALSE, NULL);
    for (int i = 0; i < N; i++)    // N = 4, i create 4 threads
    {
        iThread[i] = CreateThread(NULL, 0, thread_function, mutex, 0, NULL);
    }
    WaitForMultipleObjects(4, iThread, TRUE, INFINITE); // I wait for all threads to finish.
    printf("%d", count);
}

ожидаемый результат - тупик, фактический результат - 4000 (количество = 4000).

1 Ответ

6 голосов
/ 29 марта 2019

Другие потоки блокируются, пока не закончится поток, содержащий мьютекс. С (нормальным) концом потока мьютекс освобождается автоматически, так как его никто не держит. Но использование этой функции - плохая практика кодирования. Вы должны всегда освобождать мьютекс в явном виде.

...