【转】suspend造成死锁
备注:我最近的项目就遇到了这个问题。只用了一个CCriticalSection对象,并且全部都有释放。但还是死活没查出死锁的原因。最后才发现原来是suspend导致的。最终用CEvent替代了suspend和resume才解决。
======================
转自:http://blog.csdn.net/magictong/article/details/4161571
今天loris分享了一个关于使用suspend造成死锁的例子,部分代码如下:
UINT AFX_CDECL ThreadTest(LPVOID pvParam)
{
while (TRUE)
{
HMODULE hHandle = ::LoadLibrary("Common.dll");
if (hHandle)
{
void *pFun = (void *)::GetProcAddress(hHandle, "doSomething");
::FreeLibrary(hHandle);
}
::Sleep();
}
} void CTESTWIN2Dlg::OnOK()
{
CWinThread *pThread = AfxBeginThread(ThreadTest, (LPVOID)this,
, ,
CREATE_SUSPENDED); ::DuplicateHandle(::GetCurrentProcess(), pThread->m_hThread,
::GetCurrentProcess(), &m_hThread,
, FALSE, DUPLICATE_SAME_ACCESS);
pThread->ResumeThread();
m_bIsRun = TRUE;
SetTimer(, , NULL);
} void CTESTWIN2Dlg::OnTimer(UINT nIDEvent)
{
if (m_bIsRun)
{
::SuspendThread(m_hThread);
m_bIsRun = FALSE;
HMODULE hHandle = ::LoadLibrary("TSVul.dat");
if (hHandle)
{
void *pFun = (void *)::GetProcAddress(hHandle, "MyDoSome");
::FreeLibrary(hHandle);
}
}
else
{
::ResumeThread(m_hThread);
m_bIsRun = TRUE;
}
CDialog::OnTimer(nIDEvent);
}
win32下的API基本都是线程安全的,因此API里面有很多线程同步的地方,LoadLibrary里面有一个临界区,线程函数在执行到LoadLibrary里面之后,如果刚好走到LoadLibrary的临界区里面,此时主线程的ontimer触发,将该线程挂起,ontimer继续执行,运行到LoadLibrary后,由于线程中LoadLibrary还没有从临界区出来,此时就造成主线程ontimer里面的LoadLibrary无限等待,主线程挂起。
因此不建议用suspend暂停线程,MSDN也有说明,suspend最好只在debug里面使用。
那怎么使线程挂起呢?可以使用事件等方式,用wait族函数来暂停线程。
【END】
【转】suspend造成死锁的更多相关文章
- 深入理解Java中的锁(二)
locks包结构层次 Lock 接口 方法签名 描述 void lock(); 获取锁(不死不休) boolean tryLock(); 获取锁(浅尝辄止) boolean tryLock(long ...
- Thread.suspend和println使线程死锁
Thread.suspend和println使线程死锁 package com.stono.thread2.page39; public class MyThread extends Thread{ ...
- jstack简单使用,定位死循环、线程阻塞、死锁等问题
当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位: 废话不说,直接上例子吧,在window平台上的: 死循环 写个死循环的程序如下: pac ...
- 被废弃的 Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit
最近学习多线程的知识,看到API里说这些方法被废弃了,就查了一下原因 Thread.stop 这个方法会解除被加锁的对象的锁,因而可能造成这些对象处于不一致的状态,而且这个方法造成的ThreadDea ...
- java 死锁及解决
Java线程死锁如何避免这一悲剧 Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键.不幸的是,使用上锁会带来其他问题.让我们来看一些常见问题以及相应的解决方法: Jav ...
- java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?
java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类 ...
- JAVA多线程suspend()、resume()和wait()、notify()的区别
suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态.典型 ...
- Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
Thread.stop, Thread.suspend, Thread.resume被标记为废弃的方法.在查看JDK的文档时,提到了下面的参考文章,先是英文版,接着是中文翻译. Why is Thre ...
- Java 多线程 死锁 隐性死锁 数据竞争 恶性数据竞争 错误解决深入分析 全方向举例
在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些特殊的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同.因此,在编写多线程程序时,事先认 ...
随机推荐
- 观文章《Linux系统管理员修炼三层次》有感
层次,都不陌生,通俗讲,就是和档次挂钩的,初入江湖时,都想自己几年后,武艺精深,深藏百技,忙时带领团队打BOSS,闲时喝酒论道,博古纵今,想想都令人精神满满,干劲十足!!! 至今已入江湖几载,回首来 ...
- ubuntu下安装配置minicom(解决默认的端口/dev/tty8,改不过来的问题)
Minicom是linux下串口通信的软件,下面讲下ubuntu Minicom的安装和配置. 安装: sudo apt-get install minicom 或在新立得软件包管理器中搜索“mini ...
- IIS状态监测(如果状态错误则重启IIS)
步骤: 1:建立健康监测文件.文件内容随意,这里以healthcheck.aspx命名,内容是<span>hellow word</span> 2:利用vbs语言执行IIS重启 ...
- 【HTML】如何判断当前浏览器是否是IE
HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...
- php截取字符去掉最后一个字符
$str="中国.美国.俄罗斯.德国."$str=substr($str,0,-1); 输出结果为:中国.美国.俄罗斯.德国
- Fiddler高级用法-抓取手机app数据包
在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作呢? Andriod配置方法 1)确保手机 ...
- ReferenceError: weakly-referenced object no longer exists Python kafka
Python存入kafka报错,ReferenceError: weakly-referenced object no longer exists. Exception in thread 14: p ...
- C#基础第五天-作业-用DataTable制作名片集
1.用DataTable集合去实现名片集.(增加,修改,删除,查询,查询全部)需求:根据人名去(删除/查询).指定列:姓名,年龄,性别,爱好,电话. 本系列教程: C#基础总结之八面向对象知识点总结- ...
- mysql存储过程基础
存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储 ...
- MySQL 5.6学习笔记(数据类型)
MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. 数值数据类型:包括整数类型TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT.浮点小数类型FLOAT的 ...