主线程 和多个线程都调用主线程的 函数GetCheckedRadio() 需不需要同步?如果不同步主线程是不是可能阻塞?
解决方案 »
- 哪里有中文版的 比较详细的介绍 PE文件格式 书 或者电子文档?
- 我写的驱动,一在卸载时一调用IoDeleteDevice(pDevExt->pDevice)这句就蓝屏,希望高手指教,不慎感激!
- USB操作中如何通过GUID得到路径字符串呢?
- 有关操作系统问题!
- 如何制作一个欢迎界面,启动时显示2秒后消失
- 有本事的进,在线等,给100分
- 请问怎么拷贝文件
- 急!! CToolBar派生子类中怎么接收WM_command消息?
- 寻求解决之道:关于图象与声音同步问题!高分!
- 有关在DLL中安装钩子
- 主程序里怎么判断是否还有线程在执行?如何强行终止它?
- 【名企招聘至少sixK】开源软件/搜索技术/MFC/C++软件工程师!
原因:同步对象 SynObj(可以使任何同步对象)
假定:你的窗口在MainThread中创建,也就是说消息在MainThread中处理:
MainThread
{
MsgLoop
{
case WM_XXXX:
SynObj.Lock()
....
SynObj.UnLock()
break;
}
}Thread_A
{
SynObj.Lock()
。
GetCheckedRadio();
。
SynObj.Lock()
}这2个Thread 同时运行 就有可能出现死锁现象, GetCheckedRadio() 内部是通过SendMessage实现的,
当Thread A SynObj.Lock() 锁定对象子后, MainThread 的 SynObj.Lock()进行等待状态,而Thread_A 的 GetCheckedRadio()
是通过SendMessage实现的 那么这个SendMessage 发送到MainThread的消息 就会放入MainThread的对列当中
等待执行,而MainThread的MsgLoop一直处于等待状态无法取出消息进行处理,那么Thread A 的GetCheckedRadio(), 也进入了无限期等待状态, 所以这样就产生了一个死锁Thread