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

问题描述

一个关于线程挂起、唤醒的问题
在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(""suspendn"");
SuspendThread(hThreadA); // 挂起线程A,此处中主线程会被阻塞

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

}

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

解决方案

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

时间: 2024-08-03 10:26:18

线程 死锁-一个关于线程挂起、唤醒的问题的相关文章

mfc线程挂起唤醒操作问题

问题描述 mfc线程挂起唤醒操作问题 HANDLE hThread; CWnd *pWnd; UINT TextShow(LPVOID pParam) { CString szLine; //打开文件 CStdioFile file; file.Open(_T("E:1.txt"), CFile::modeRead); //逐行读取字符串 while (file.ReadString(szLine)) { pWnd->SetWindowText(szLine); hThread

一个跨线程创建窗口的死锁案例

出于某种需要,我们有时可能会实现一个如下描述的场景: 在线程 A 中,创建一个窗口,称为窗口 X. 窗口 X 创建后,创建一个子窗口,称为窗口 Y,并且 Y 所属一个新线程,称为线程 B. 简单来说,父子窗口分别所属不同的线程. 需求描述完毕,现在进入实现的阶段.我以一个简单的例子来实现这个场景,其中 X 为一个自定义窗口,Y 为一个按钮.为了使 按钮从属线程 B,那么我们需要在线程 B 中创建它,并实现其消息队列的分发.另外,父窗口在某个时机(比如 WM_CREATE)创建线程 B.最后,父窗

synchronized-Java的一个简单线程死锁问题

问题描述 Java的一个简单线程死锁问题 class BadPerson { public synchronized void say(GoodPerson good) { System.out.println(""把钱给我,放了你的人.""); good.give(); } public synchronized void give() { System.out.println(""得到了钱,同时被警察抓了.""); }}c

java的线程死锁

由于线程可能进入堵塞状态,而且由于对象可能拥有"同步"方法--除非同步锁定被解除,否则线程不能访问那个对象--所以一个线程完全可能等候另一个对象,而另一个对象又在等候下一个对象,以此类推.这个"等候"链最可怕的情形就是进入封闭状态--最后那个对象等候的是第一个对象!此时,所有线程都会陷入无休止的相互等待状态,大家都动弹不得.我们将这种情况称为"死锁".尽管这种情况并非经常出现,但一旦碰到,程序的调试将变得异常艰难. 就语言本身来说,尚未直接提供防

多线程专题之线程死锁原因之谜

引子:线程死锁曾是多少程序员的噩梦,每每为此食不甘味,夜不成寐,一句话:苦不堪言.本文从几个场景入手,试图解开产生死锁的原因之谜. 教科书:说的很具体,理解很抽象 关于死锁产生的原因<操作系统>中有比较好的说明: (1)因为系统资源不足. (2)进程运行推进的顺序不合适. (3)资源分配不当等. 关于死锁出现的必要条件也有比较具体的说明: (1)互斥条件:一个资源每次只能被一个进程使用. (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3)不剥夺条件:进程已获得的

线程死锁的质疑

问题描述 在网上搜到一篇线程死锁的博客,后来发现,两个线程并不会发生死锁.我的理由是Threadthread01=newThread(run01);Threadthread02=newThread(run02);这两个线程构造函数传进来的参数Runnable对象run01,run02,会分别创建obj1.obj2,也就说两个线程通过synchronized(obj1)和synchronized(obj2)并不能实现互斥.[/color]packagecn.thread;publicclassTh

c++-C++ Builder6 子线程向一个StringGrid写入数据时无法再点击Form上的按钮

问题描述 C++ Builder6 子线程向一个StringGrid写入数据时无法再点击Form上的按钮 C++ Builder6 子线程向一个StringGrid写入数据时无法再点击Form上的按钮 解决方案 不要直接在线程中操作界面,应该发消息让线程自己去做,参考:http://blog.163.com/tfn2008@yeah/blog/static/110321319201451212028126/ 解决方案二: 死锁了,两个线程互相在等 解决方案三: 代码中是否存在线程之间同步的机制,

android-Android程序运行一段时间后,程序没有报错,线程会自动会被挂起

问题描述 Android程序运行一段时间后,程序没有报错,线程会自动会被挂起 程序是这么个情况,主界面显示一个图片,另起一个线程去定时刷新这个图片,运行一段时间后,程序自己就会停止,动一下手机,程序能继续运行,网上查的说Android系统自己会挂起线程,跪求解决方案 解决方案 在程序中有没有申请WeakLock,阻止系统进入休眠状态?

参数传递-c#用线程打开一个新窗口并传参数显示

问题描述 c#用线程打开一个新窗口并传参数显示 我想在form1用线程打开新的通知窗口form2,并传参数过去显示在这个窗口上,每个通知窗口显示一分钟,然后自动关闭.可能同时新建并显示三到四个这样的窗口,并不影响form1的正常运行.现在用百度到的方法,要么无法传参,要么显示秒退.求大神给个实例. 解决方案 不要在线程中创建窗口或者操作UI,应该用invoke传委托.传参数可以通过构造函数. 解决方案二: 建议你在程序中建立队列 Queue<string> infoQueue=new Queu