pthread_cond_signal 段错误
我写了个lib, 封装了一个线程类
#include "ExThread_Linux.h"
#include <sys/types.h>
#include <unistd.h>
#define EXIT_THREAD_TIMEOUT 2000//2second
//--------------------------------------------------------------------------------------------
CExThread_Linux::CExThread_Linux(void* pCallback, void* pOwner)
{
m_pCallbackFunc = (CallBackDoWithData)pCallback;
m_pOwner = pOwner;
m_bCond = false;
pthread_mutex_init(&m_mutex, NULL);
pthread_cond_init(&m_cond, NULL);
m_bThreadStart = true;
}
CExThread_Linux::~CExThread_Linux()
{
DestroyThread();
}
//--------------------------------------------------------------------------------------------
int CExThread_Linux::DestroyThread()
{
if (m_thread_id)
{
m_bThreadStart = false;
SetSignal();
pthread_join(m_thread_id, NULL);
pthread_mutex_destroy(&m_mutex);
pthread_cond_destroy(&m_cond);
}
return 1;
}
//--------------------------------------------------------------------------------------------
bool CExThread_Linux::CreateThread()
{
int ret = 0;
pthread_attr_t attr;
sched_param param;
ret = pthread_create(&m_thread_id, NULL, Thread, this);
if(ret!=0)
{
printf("create pushthread error!\n");
return false;
}
int n_MaxPriority = 0;
sched_get_priority_max(n_MaxPriority);
pthread_attr_getschedparam(&attr, ¶m);
param.sched_priority = n_MaxPriority;
pthread_attr_setschedparam(&attr, ¶m);
return true;
}
void CExThread_Linux::SetSignal()
{
pthread_cond_signal(&m_cond);
//printf("SetSignal-------d\r\n");
}
//--------------------------------------------------------------------------------------------
bool CExThread_Linux::SetEventAndTimeout(bool bCondition, const struct timeval* tv)
{
m_bCond = bCondition;
if (!m_bCond && (struct timeval*)tv==NULL)
return false;
m_timeout = (struct timeval*)tv;
return true;
}
//--------------------------------------------------------------------------------------------
void* CExThread_Linux::Thread( void* lParam )
{
int nRetVal = 0;
int nCallBackResult = 0;
struct timeval now;
CExThread_Linux* pThis = ( CExThread_Linux* )lParam;
if( !pThis )
return 0;
if (!pThis->m_bCond)
{
while(true)
{
now.tv_sec = pThis->m_timeout->tv_sec;
now.tv_usec = pThis->m_timeout->tv_usec;
int nRetVal = select( 0, NULL , NULL , NULL , &now);
if ( -1 == nRetVal )
{
printf( "CListonSocket::Select Error\n" );
return false;
}
pThis->m_pCallbackFunc(pThis->m_pOwner);
}
}
else
{
while (true)
{
pthread_mutex_lock(&(pThis->m_mutex));
pthread_cond_wait(&(pThis->m_cond),&(pThis->m_mutex));
pthread_mutex_unlock(&(pThis->m_mutex));
if (!pThis->m_bThreadStart)
break;
if ( pThis->m_pCallbackFunc )
{
pThis->m_pCallbackFunc(pThis->m_pOwner);
}
}
}
return 0;
}