太阳代表MyHeart 2014-10-18 11:24 采纳率: 0%
浏览 4121

一个关于线程挂起、唤醒的问题

在windows平台上, 线程的挂起可以使用API SuspendThread()函数,而减少线程的挂起计数则可以使用ResumeThread()函数,但是今天却发现了其中隐藏的问题:
1. 现有一个主线程和子线程A,在主线程中调用SuspengThread()使得A被挂起;
2. 主线程中调用ResumeThread()使得A恢复运行;
3. 主线程立刻调用SuspendThread()意图挂起A时,主线程竟然被阻塞在了调用处!也就是说产生了deadlock!

初步的分析如下:
1. 线程A并没有等待的事件,也没有做挂起自身之类的操作,仅仅是循环打印:
for(;;)
{
printf("threadA got running.");
Sleep(300);
}
2. 主线程执行这样的行为:
CreateThread(NULL, ThreadAProc, NULL, &dwThreadIdA);
Sleep(500); // 等待子线程A启动
for(;;)
{
printf("suspend\n");
SuspendThread(hThreadA); // 挂起线程A,此处中主线程会被阻塞

Sleep(200);
printf("resume\n");
ResumeThread(hThreadA); // 使线程A回复运行

}

我的猜测是这样的:SuspendThread()和ResumeThread()是异步的系统调用,即应用层发起调用后,只是简单的发起调用请求,然后直接返回, 内核会在一个不确定的时间后真正的执行该请求,这就极可能导致先发起的调用请求反而后执行,例如SuspendThread()和ResumeThread(),于是导致线程死锁。
希望高手不吝赐教啊

  • 写回答

1条回答

  • oyljerry 2015-01-01 14:19
    关注

    判断一下SuspendThread()和ResumeThread() API的返回值,是否成功

    评论

报告相同问题?

悬赏问题

  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64