引起线程死锁的一种情况及解决方法
2006-11-23 11:30
429 查看
typedef CList<CObject> CListData;
class CDataDlg
{
public:
void InsertToListCtrl(const CListData& ListData)
{
m_cs.Lock();
for (...)
{
m_ctlListData.InsertItem(...);
}
m_cs.Unlock();
}
protected:
CListCtrl m_ctlListData;
mutable CCriticalSection m_cs;
}
extern CDataDlg DataDlg;
class CGlobalData
{
public:
void ShowData() { DataDlg.InsertToListCtrl(m_listObj); }
/*
void ShowData() { DataDlg.PostMessage(MSG_SHOWDATA); }
*/
protected:
CListData m_listObj;
}
分析:在调用CGlobal::ShowData时会出现死锁,因为CDataDlg所依附的线程在调用CDataDlg::InsertToListCtrl函数时,碰到m_cs.Lock()会被锁住,而接下来调用的函数m_ctlListData.InsertItem其中又会调用SendMessage函数,SendMessage是个同步函数,需要函数返回才能运行,而当前线程已经被锁住,所以SendMessage无法运行;而当前程序又因为SendMessage无法返回而无法运行,这就形成了死锁.
解决方法:在CGlobal::ShowData中使用PostMessage向CDataDlg投递消息,这样做的好处是CDataDlg锁依附的线程可以将消息串行化,避免死锁.
class CDataDlg
{
public:
void InsertToListCtrl(const CListData& ListData)
{
m_cs.Lock();
for (...)
{
m_ctlListData.InsertItem(...);
}
m_cs.Unlock();
}
protected:
CListCtrl m_ctlListData;
mutable CCriticalSection m_cs;
}
extern CDataDlg DataDlg;
class CGlobalData
{
public:
void ShowData() { DataDlg.InsertToListCtrl(m_listObj); }
/*
void ShowData() { DataDlg.PostMessage(MSG_SHOWDATA); }
*/
protected:
CListData m_listObj;
}
分析:在调用CGlobal::ShowData时会出现死锁,因为CDataDlg所依附的线程在调用CDataDlg::InsertToListCtrl函数时,碰到m_cs.Lock()会被锁住,而接下来调用的函数m_ctlListData.InsertItem其中又会调用SendMessage函数,SendMessage是个同步函数,需要函数返回才能运行,而当前线程已经被锁住,所以SendMessage无法运行;而当前程序又因为SendMessage无法返回而无法运行,这就形成了死锁.
解决方法:在CGlobal::ShowData中使用PostMessage向CDataDlg投递消息,这样做的好处是CDataDlg锁依附的线程可以将消息串行化,避免死锁.
相关文章推荐
- Xampp环境下,MySQL意外退出的一种情况与解决方法
- 常见的表死锁情况及解决方法
- Swap的一种死锁及解决方法
- Win7 64bit 系统安装DirectX提示失败的一种情况的解决方法记录
- Oracle数据表中的死锁情况解决方法
- sqlserver高并发情况下 select 和update操作造成死锁的解决方法
- 多线程编程:线程死锁的原因以及解决方法
- Oracle数据表中的死锁情况解决方法
- 用gdb脚本解决死锁的调试方法(由pthread_mutex_lock引起的死锁)
- log4cpp的RollingFileAppender异常情况下日志文件不拆分的一种可能解决方法
- 程序界面假死的一种解决方法 - 线程
- 尝试解决在构造函数中同步调用Dns.GetHostAddressesAsync()引起的线程死锁
- 工作线程操作主界面控件引起死锁及解决
- 工作线程操作主界面控件引起死锁及解决
- 线程的一种解决死锁的方式
- Oracle数据表中的死锁情况解决方法
- aspx页面调用COM组件引发异常的一种情况及解决方法
- sqlserver高并发情况下 select 和update操作造成死锁的解决方法
- error C2371: redefinition; different basic types一种情况的解决方法
- java线程死锁例子及解决方法