太阳代表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 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题