#include <windows.h>
#include <stdio.h>
#include <process.h>
unsigned __stdcall thread(void*)
{
while(1)
{
printf("t");
}
}
int main()
{
unsigned dwThreadId;
HANDLE hThread = (HANDLE) _beginthreadex(NULL, 0, thread, NULL, 0, &dwThreadId);
while(1) {
SuspendThread(hThread);
printf(".");
ResumeThread(hThread);
}
return 0;
}
- 现象:
线程与主线程会在printf处死锁
- 原因:
printf内部会系统加锁,由于SuspendThread函数会在任意时刻都会挂起线程,一旦子线程挂起时还没有释放锁,主线程调用printf就会陷入无限等待中。TerminateThread也有此问题。
- 总结:
不要轻易使用SuspendThread、TerminateThread函数。一旦实际环境中出现这种死锁,是很不好查的!
SuspendThread与死锁
本文探讨了在Windows环境下使用SuspendThread函数可能导致的死锁问题。通过一个简单的C++示例程序,演示了当子线程被挂起时未释放printf函数内部锁的情况,会导致主线程陷入无限等待。文章提醒开发者避免随意使用SuspendThread和TerminateThread函数。
2284

被折叠的 条评论
为什么被折叠?



