太阳代表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 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记