多线程: 在自然死亡中发生死锁! 万分郁闷ing... 请高人帮忙!
风里有梦 2008-02-28 01:11:28 我写了一个多线程管理类, 如下:
typedef bool (*PFNTHREADPROC)(void*);
typedef enum enumThreadStatus :int32
{
tsNull = 0,
tsTerminated,
tsExiting,
tsPause,
tsRunning
}ThreadStatusEnum;
class CWorker
{
public:
...
bool SetJob( PFNTHREADPROC pfnTheadProc, void* pvParam,... )
{
...
m_pfnThreadProc = pfnTheadProc;
m_pvParam = pvParam;
m_hThread = (HANDLE)chBEGINTHREADEX( NULL, 0, CWorker::_ThreadProc, this, CREATE_SUSPENDED, &m_uThreadId );
...
}
void EndJob( bool bWaitExit )
{
...
_SetStatus( tsExiting );
if ( bWaitExit )
::WaitForSingleObject( m_hThread, INFINITE );
_SafeObjFree(::CloseHandle, m_hThread)
}
private:
static unsigned __stdcall _ThreadProc( void* pvParam );
PFNTHREADPROC m_pfnThreadProc;
void* m_pvParam;
...
}
unsigned __stdcall CWorker::_ThreadProc( void* pvParam )
{
CWorker* pWorker = (CWorker*) pvParam;
if ( pWorker->GetStatus() != tsRunning )
goto ExitFlags;
PFNTHREADPROC pfnThreadProc = pWorker->GetThreadProc();
if ( pfnThreadProc == NULL )
goto ExitFlags;
DWORD dwPrev = ::timeGetTime() + pWorker->GetFrequency();
while ( pWorker->GetStatus() > tsExiting )
{
if ( pWorker->IsRunning() && dwPrev < ::timeGetTime() )
{
(*pfnThreadProc) ( (void*)pWorker->GetThreadParam() );
dwPrev = ::timeGetTime() + pWorker->GetFrequency();
}
pWorker->Sleep( 30 );
}
ExitFlags:
pWorker->_SetStatus( tsTerminated );
_endthreadex( 0 ); // 出错点!
return 0;
}
这个类,我在使用一个线程时没事, 当我创建了多个后, 特别是100左右时, 就出现了在结束线程时死锁的问题!
以下调用代码:
线程定义:
#define MAX_WORKER 100
CWorker worker[MAX_WORKER];
线程函数:
bool Test( void* pvParam )
{
...
}
线程创建代码:
for ( int i = 0; i < MAX_WORKER; ++i )
worker[i].SetJob( test, (void*)i,... );
线程结束代码:
for ( int i = 0; i < MAX_WORKER; ++i )
worker[i].EndJob( TRUE );
当我在结束线程时告诉结束方法需要等线程完成退出后也就是收到信号后, 才做析构CWorker类的操作. 也就是这段代码:
if ( bWaitExit )
::WaitForSingleObject( m_hThread, INFINITE );
_SafeObjFree(::CloseHandle, m_hThread)
因为静态方法的线程在执行_endthreadex(0)时出现死锁,所以导致我的整个程序当掉! 请高人指点. 多谢!