在编写windows程序时,只有一个临界区还出现死锁的常见原因。
2015-02-09 12:30
429 查看
这是我两年前遇到的问题,只有一个临界区,在对窗口进行操作的时候就会出现死锁!按照我当时的经验,我想到的是:你妹,只有一个临界区竟然锁起了,电脑你有没有认真看教科书啊?
还好那中情况很容易触发,经过多次调试,以及在CSDN朋友们的帮助下,确认了问题的根源,那就是:win程序在用SendMessage发送、响应消息的时候也相当于是一个临界区,因为用Send的方式发送消息时,会等待消息被处理之后再返回。而对界面的操作几乎都要用Send的方式发送消息。
若出现以下的步骤,在只有一个临界区的时候就会死锁:
1.线程1进入临界区
2.操作界面触发Send方式的消息A
3.响应消息A,需要进入临界区(等待进入)
4.线程1用Send方式发送消息B(等待响应)
此时,线程1 进入了临界区,等待响应消息。主线程正在响应消息,但是要等待进入临界区才能完成,于是死锁了。
还好那中情况很容易触发,经过多次调试,以及在CSDN朋友们的帮助下,确认了问题的根源,那就是:win程序在用SendMessage发送、响应消息的时候也相当于是一个临界区,因为用Send的方式发送消息时,会等待消息被处理之后再返回。而对界面的操作几乎都要用Send的方式发送消息。
若出现以下的步骤,在只有一个临界区的时候就会死锁:
1.线程1进入临界区
2.操作界面触发Send方式的消息A
3.响应消息A,需要进入临界区(等待进入)
4.线程1用Send方式发送消息B(等待响应)
此时,线程1 进入了临界区,等待响应消息。主线程正在响应消息,但是要等待进入临界区才能完成,于是死锁了。
相关文章推荐
- 3.有一个整形数组,只有一个数字出现了一次,请编写程序判断这个数字(大概题目就是这样的,记不太清了)
- 访问Web应用时出现404错误的常见原因
- 用 C 语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址
- 自己编写的一个求字符串中子串出现次数计算小程序字串长度为2
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器、HttpModule 或服务器跟踪。
- 导致交换机接口出现err-disable的几个常见原因
- Dnn中常见的一个错误及可能原因:Could not find stored procedure 'dbo.GetPortals'
- java 10大常见异常,出现的原因和解决方法
- asp+access中 打开网页时出现“操作必须使用一个可更新的查询”原因及解决办法
- .NET调用Java方法时出现的一个错误及其原因
- 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器、HttpModule 或服务器跟踪。
- 编译程序出现一个: 可访问性不一致; 产生的原因和解决方法
- asp中 打开网页时出现“操作必须使用一个可更新的查询”原因及解决办法
- VC出现Compiling...和Linking... 死锁问题的原因和解决方案(郁闷了一个星期)
- iis安装经常出现的找不到xxx文件的一个原因及解决办法
- 一个网友的ajax进度条,出现错误的原因
- 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次
- 失败的原因只有一个——那就是放弃!
- 有可能导致HttpQueryInfo 执行时出现12150 错误的一个原因
- jdbc连接SQLServer2005出现 NO suitable driver问题的一个原因