请大家给检查下,下面实现的条件变量是否有异常
请大家给检查下,下面实现的条件变量是否有错误
为了能使自己项目夸平台,对多线程进行加锁操作,在windows下直接使用相关的api 其他平台使用pthread
之前线程这一块一直使用第三方的库,自己写线程代码写的少,想把第三方的代码抽出来又要费很大的劲
现在自己凭感觉写一个条件变量的锁,但windows没这个概念,据说windows下vista之后在有才有条件的变量的概念,为了兼容XP,还是用老的windows api实现了一个条件变量,请大家帮帮忙,瞧瞧时候有什么错误,我自己简单测试了下还可以,哎,又做了一遍轮子,我表示有点罪恶感,希望大家给指正
基本的原理是,使用了windows中的事件对象和临界区结合使用
代码奉上:
简单的锁,对临界区的简单封装
条件变量对象
------解决方案--------------------
看着大概流程是这样的
Notify_All是不是把wait_num设为0更合逻辑些?
还有,为啥不用第三方的线程库啊,boost的线程库都成C++11的标准了
------解决方案--------------------
跨平台的项目为何不用跨平台的库呢,难道楼主希望同一个功能在不同的平台上有不同的表现么
为了能使自己项目夸平台,对多线程进行加锁操作,在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的标准了
------解决方案--------------------
跨平台的项目为何不用跨平台的库呢,难道楼主希望同一个功能在不同的平台上有不同的表现么