求助:线程死锁,,解决后200分奉上!
由于代码太多,代码贴不上了,我现在已经写到我的BLOG上,麻烦大家帮下忙,看看是那里导致死锁了,解决后200分奉上!
我也是按着一篇文章写的代码.大家帮帮我谢谢
代码网址
http://blog.csdn.net/tdjdyq/archive/2009/03/06/3964695.aspx
[解决办法]
先mark,等会在看
[解决办法]
格式有点乱,代码有点长,看的好幸苦啊。。。
[解决办法]
我blog里面有篇关于调试线程死锁的文章,对于CriticalSection造成的死锁应该会有些帮助,lz不妨看看。
VC++6.0调试篇:定位临界区(critical section)导致的死锁
http://blog.csdn.net/coding_hello/archive/2008/12/10/3487793.aspx
[解决办法]
- C/C++ code
void CThreadPool::SetTask(list<CBase*> pTaskList) //归还任务{ { CAutoSynchronizer Syncher(m_TaskLock); list<CBase*>::iterator iter; for (iter = pTaskList.begin(); iter != pTaskList.end(); ++iter) { CBase *pBaseTask = (*iter); AddTask(pBaseTask); } }}void CThreadPool::AddTask(CBase *pBaseTask) { if (m_bStoped) { cout << "-----The threadpool is destroyed. \n"; return; } CAutoSynchronizer Syncher(m_TaskLock); m_TaskList.push_back(pBaseTask);}
[解决办法]
这样的代码不死锁才怪啊,给你一个思路:
func1()
{
L(a);
{
L(b);
{
// ??? ... ...
}
U(b);
}
U(a);
}
和
func2()
{
L(b);
{
L(a);
{
// ??? ... ...
}
U(a);
}
U(b);
}
存在时必然会死锁,解决办法是:
func2()
{
L(b);
{
// 把 func3 放到独立线程中执行
asynchrun->add(func3);
}
U(b);
}
func3()
{
L(a);
{
// ??? ... ...
}
U(a);
}
[解决办法]
1.变量申明“bool m_bThreadExit;”可能存在问题,因为代码“ if( WaitForTask()) continue;// 继续循环”不停在读取它,而该值有可能直接从寄存器或者高速缓冲区读取,建议换成“volatile bool m_bThreadExit”,强迫其从内存中读取。
2.你可以跟踪每个函数的调用情况,建立类似如下类:
class FuncTrace
{
DWORD _dwThdId;
CString _sFuncName;
FuncTrace( const DWORD& dwThdId, LPCTSTR sFuncName )
: _dwThdId( dwThdId ),
_sFuncName( sFuncName )
{
cout<<"ThdId="<<dwThdId<<"Enter Func"<<sFuncName<<endl;
}
virtual ~FuncTrace()
{
cout<<"ThdId="<<dwThdId<<"Leave Func"<<sFuncName<<endl;
}
}
在每个函数的开始处申明该对象。
若发生死锁,则可以通过输出看到某线程进入某函数后,一直没有出来,再仔细分析那个函数的代码。
[解决办法]
我很想了解一下楼主是怎么确定死锁的?
不过,我有几点建议
首先,需要确定的是,产生死锁的情况一般发生在同一个函数里面请求两把锁的情况
而且,必须存在两个这样的函数,才会有死锁的可能,楼主仔细检查一下满足条件的函数
其次,我稍稍看了你的代码不是很全,调试不方便
但是,可以确定的是,能够产生死锁的函数入口为threadpool::excute和workthread::excute
因为,这几个函数是在不同的线程里面运行
而workthread::excute里面与线程池的交互只有一个函数
- C/C++ code
m_pool->OnTaskIdle(this); // 通知线程池,此线程已经空闲
[解决办法]