请大家给检查下,下面实现的条件变量是否有错误
本帖最后由 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 CondLockerC++?锁?事件 事件 条件变量 线程锁
{
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:
HANDLEevent;// 事件
intwait_num;// 等待线程的数量
Lockerlocker;// wait_num的锁
private:
// 禁止拷贝和赋值构造
CondLocker( const CondLocker& ) {};
CondLocker& operator = ( const CondLocker& ) { return *this; };
};