linux 条件变量的封装

条件变量的处理比较复杂,需要有 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();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值