如果一个线程锁定了一个互斥锁而没有将其解锁,那么其他线程是否应该被阻塞?

Jav*_*per 3 c winapi multithreading mutex

以下代码的输出为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);
}
Run Code Online (Sandbox Code Playgroud)

预期结果是死锁,实际结果是4000(计数= 4000)。

use*_*709 6

其他线程被阻塞,直到持有互斥锁的线程结束。互斥锁在线程的(正常)端自动释放,因为没有人握住它。但是使用该功能是不好的编码习惯。您应该始终释放显式互斥量。