【发布时间】:2019-08-20 01:27:10
【问题描述】:
下面代码的输出是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(count = 4000)。
【问题讨论】:
-
无错误检查。酌情查看返回码和 GetLastError(),您可能会自己找出答案。
-
互斥锁强制所有4个线程依次执行。当第一个获得它的线程完成并消失时,它就失去了所有权。这意味着这段代码不仅等待线程停止工作,它还等待线程被删除。所以这段代码比单线程程序效率低得多。
-
为了将来参考,请用winapi标记有关Windows线程的问题。这会引起正确的人对问题的关注。
标签: c multithreading winapi mutex