请大家给检查下,下面实现的条件变量是否有异常

请大家给检查下,下面实现的条件变量是否有错误
本帖最后由 xnayufenglin 于 2013-11-26 18:10:57 编辑
为了能使自己项目夸平台,对多线程进行加锁操作,在windows下直接使用相关的api 其他平台使用pthread
之前线程这一块一直使用第三方的库,自己写线程代码写的少,想把第三方的代码抽出来又要费很大的劲
现在自己凭感觉写一个条件变量的锁,但windows没这个概念,据说windows下vista之后在有才有条件的变量的概念,为了兼容XP,还是用老的windows api实现了一个条件变量,请大家帮帮忙,瞧瞧时候有什么错误,我自己简单测试了下还可以,哎,又做了一遍轮子,我表示有点罪恶感,希望大家给指正


基本的原理是,使用了windows中的事件对象和临界区结合使用

代码奉上:

简单的锁,对临界区的简单封装
	class Locker
{
public:
Locker()
{
InitializeCriticalSection(&critical_section);
}

~Locker()
{
DeleteCriticalSection(&critical_section);
}

void Lock()
{
EnterCriticalSection(&critical_section);
}

void Unlock( )
{
LeaveCriticalSection(&critical_section);
}

protected:
CRITICAL_SECTION critical_section;

private:
// 禁止拷贝和赋值构造
Locker( const Locker& ) {};
Locker& operator = ( const Locker& ) { return *this; };
};


条件变量对象
	class CondLocker
{
public:
CondLocker()
: wait_num(0)
{
// 自动事件
event = CreateEvent( NULL, FALSE, FALSE, NULL );
}

~CondLocker()
{
CloseHandle( event );
}

void Wait()
{
locker.Lock();
++wait_num;
locker.Unlock();

WaitForSingleObject( event, INFINITE );
}

void Notify_One()
{
locker.Lock();
if ( wait_num > 0 )
{
SetEvent( event );
--wait_num;
}
locker.Unlock();
}

void Notify_All()
{
locker.Lock();
while ( wait_num > 0 )
{
SetEvent( event );
--wait_num;
}
locker.Unlock();
}

protected:
HANDLE event; // 事件
int wait_num; // 等待线程的数量
Locker locker; // wait_num的锁

private:
// 禁止拷贝和赋值构造
CondLocker( const CondLocker& ) {};
CondLocker& operator = ( const CondLocker& ) { return *this; };
};
C++ 锁 事件 事件 条件变量 线程锁

------解决方案--------------------
看着大概流程是这样的
Notify_All是不是把wait_num设为0更合逻辑些?
还有,为啥不用第三方的线程库啊,boost的线程库都成C++11的标准了
------解决方案--------------------
跨平台的项目为何不用跨平台的库呢,难道楼主希望同一个功能在不同的平台上有不同的表现么