首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-11-29 
请大家给检查下,下面实现的条件变量是否有错误本帖最后由 xnayufenglin 于 2013-11-26 18:10:57 编辑为了

请大家给检查下,下面实现的条件变量是否有错误
本帖最后由 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:
HANDLEevent;// 事件
intwait_num;// 等待线程的数量
Lockerlocker;// wait_num的锁

private:
// 禁止拷贝和赋值构造
CondLocker( const CondLocker& ) {};
CondLocker& operator = ( const CondLocker& ) { return *this; };
};
C++?锁?事件 事件 条件变量 线程锁
[解决办法]
看着大概流程是这样的
Notify_All是不是把wait_num设为0更合逻辑些?
还有,为啥不用第三方的线程库啊,boost的线程库都成C++11的标准了
[解决办法]
跨平台的项目为何不用跨平台的库呢,难道楼主希望同一个功能在不同的平台上有不同的表现么

热点排行