条件变量的处理比较复杂,需要有
flag
变量、固定的函数调用序列等等
能否简化条件变量的使用
封装的思路:
Windows
的事件机制
让一个线程等待某一个事件的发生
线程的业务逻辑:
然后主线程中等待事件的发生:
class CLEvent
{
public:
/*
构造函数和析构函数出错时,会抛出字符串类型异常
*/
CLEvent( );
virtual ~CLEvent();
public:
CLStatus Set();
CLStatus Wait();
private:
CLEvent(const CLEvent&);
CLEvent& operator=(const CLEvent&);
private:
CLMutex m_Mutex;
CLConditionVariable m_Cond;
volatile int m_Flag;
};
CLStatus CLEvent::Set()
{
try
{
CLCriticalSection cs(&m_Mutex);
m_Flag = 1;
}
catch(const char *str)
{
CLLog::WriteLogMsg("In CLEvent::Set(), exception arise", 0);
return CLStatus(-1, 0);
}
CLStatus s = m_Cond.Wakeup();
if(!s.IsSuccess())
{
CLLog::WriteLogMsg("In CLEvent::Set(), m_Cond.Wakeup error", 0);
return CLStatus(-1, 0);
}
return CLStatus(0, 0);
}
CLStatus CLEvent::Wait()
{
try
{
CLCriticalSection cs(&m_Mutex);
while(m_Flag == 0)
{
CLStatus s = m_Cond.Wait(&m_Mutex);
if(!s.IsSuccess())
{
CLLog::WriteLogMsg("In CLEvent::Wait(), m_Cond.Wait error", 0);
return CLStatus(-1, 0);
}
}
m_Flag = 0;
}
catch(const char* str)
{
CLLog::WriteLogMsg("In CLEvent::Wait(), exception arise", 0);
return CLStatus(-1, 0);
}
return CLStatus(0, 0);
}
线程的业务逻辑:
virtual CLStatus RunExecutiveFunction(void *pContext)
{
CLEvent *pEvent = (CLEvent *)pContext;
//sleep(2);
pEvent->Set();
return CLStatus(0, 0);
}
然后主线程中等待事件的发生:
CLEvent *pEvent = new CLEvent;
CLExecutiveFunctionProvider *myfunction = new CLMyFunction();
CLExecutive *pThread = new CLThread(myfunction);
pThread->Run((void *)pEvent);
pEvent->Wait();
pThread->WaitForDeath();