易网时代-编程资源站
Welcome
微信登录
首页
/
操作系统
/
Linux
/
Linux平台用C++实现事件对象,同步线程
前文在Win32平台上用C++实现了事件对象Event,对线程进行同步(见 http://www.linuxidc.com/Linux/2011-12/49717.htm ),以达到期望目的。这次在Linux平台上实现与之类似的事件对象。与其相关的一组API包括:pthread_mutex_init,pthread_cond_init,pthread_mutex_lock,pthread_cond_wait,pthread_mutex_unlock,pthread_cond_broadcast,pthread_cond_timedwait,pthread_cond_destroy,pthread_mutex_destroy。下边,是封装的事件对象类,以及测试代码。使用VS2005编辑,在虚拟机 Fedora 13中编译,测试通过。MyEvent.h
#ifndef My_Event_Header
#define My_Event_Header
#include <iostream>
#include <pthread.h>
#include <errno.h>
using
namespace
std;
//---------------------------------------------------------------
class
CEventImpl
{
protected
:
/*
动态方式初始化互斥锁,初始化状态变量m_cond
`bAutoReset true 人工重置
false 自动重置
*/
CEventImpl(
bool
manualReset);
/*
注销互斥锁,注销状态变量m_cond
*/
~CEventImpl();
/*
将当前事件对象设置为有信号状态
若自动重置,则等待该事件对象的所有线程只有一个可被调度
若人工重置,则等待该事件对象的所有线程变为可被调度
*/
void
SetImpl();
/*
以当前事件对象,阻塞线程,将其永远挂起
直到事件对象被设置为有信号状态
*/
bool
WaitImpl();
/*
以当前事件对象,阻塞线程,将其挂起指定时间间隔
之后线程自动恢复可调度
*/
bool
WaitImpl(
long
milliseconds);
/*
将当前事件对象设置为无信号状态
*/
void
ResetImpl();
private
:
bool
m_manual;
volatile
bool
m_state;
pthread_mutex_t m_mutex;
pthread_cond_t m_cond;
};
inline
void
CEventImpl::SetImpl()
{
if
(pthread_mutex_lock(&m_mutex))
cout<<
"cannot signal event (lock)"
<<endl;
//设置状态变量为true,对应有信号
m_state =
true
;
//cout<<"CEventImpl::SetImpl m_state = "<<m_state<<endl;
//重新激活所有在等待m_cond变量的线程
if
(pthread_cond_broadcast(&m_cond))
{
pthread_mutex_unlock(&m_mutex);
cout<<
"cannot signal event"
<<endl;
}
pthread_mutex_unlock(&m_mutex);
}
inline
void
CEventImpl::ResetImpl()
{
if
(pthread_mutex_lock(&m_mutex))
cout<<
"cannot reset event"
<<endl;
//设置状态变量为false,对应无信号
m_state =
false
;
//cout<<"CEventImpl::ResetImpl m_state = "<<m_state<<endl;
pthread_mutex_unlock(&m_mutex);
}
//---------------------------------------------------------------
class
CMyEvent:
private
CEventImpl
{
public
:
CMyEvent(
bool
bManualReset =
true
);
~CMyEvent();
void
Set();
bool
Wait();
bool
Wait(
long
milliseconds);
bool
TryWait(
long
milliseconds);
void
Reset();
private
:
CMyEvent(
const
CMyEvent&);
CMyEvent& operator = (
const
CMyEvent&);
};
inline
void
CMyEvent::Set()
{
SetImpl();
}
inline
bool
CMyEvent::Wait()
{
return
WaitImpl();
}
inline
bool
CMyEvent::Wait(
long
milliseconds)
{
if
(!WaitImpl(milliseconds))
{
cout<<
"time out"
<<endl;
return
false
;
}
else
{
return
true
;
}
}
inline
bool
CMyEvent::TryWait(
long
milliseconds)
{
return
WaitImpl(milliseconds);
}
inline
void
CMyEvent::Reset()
{
ResetImpl();
}
#endif
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图