将Linux的信号量sem_t封装成事件对象
2011-12-24 20:51
477 查看
将信号量sem_t相关的一组API封装成Win32平台上的事件对象类之后,在Linux平台上就可以像使用事件对象那样,方便地进行线程同步了。
类CEventImpl可以使用Linux平台用C++实现事件对象,同步线程或用C++实现Win32事件对象,同步线程中的测试代码对其进行测试。其结果是相同的。
原创作品,欢迎转载,麻烦带上链接:http://blog.csdn.net/chexlong/article/details/7100274 谢谢合作!
class CEventImpl { protected: /* 创建匿名信号量 `bAutoReset true 人工重置 false 自动重置 */ CEventImpl(bool manualReset); /* 注销信号量 */ ~CEventImpl(); /* 将当前事件对象设置为有信号状态 若自动重置,则等待该事件对象的所有线程只有一个可被调度 若人工重置,则等待该事件对象的所有线程变为可被调度 */ void SetImpl(); /* 以当前事件对象,阻塞线程,将其永远挂起 直到事件对象被设置为有信号状态 */ bool WaitImpl(); /* 以当前事件对象,阻塞线程,将其挂起指定时间间隔 之后线程自动恢复可调度 */ bool WaitImpl(long milliseconds); /* 将当前事件对象设置为无信号状态 */ void ResetImpl(); private: bool m_manual; sem_t m_event; }; inline void CEventImpl::SetImpl() { int ret = sem_post(&m_event); if ( 0 != ret ) { cout<<"cannot signal event"<<endl; } } inline void CEventImpl::ResetImpl() { int sval = 0; do { sem_trywait(&m_event); sem_getvalue(&m_event, &sval); } while(sval > 0); }
CEventImpl::CEventImpl(bool manualReset): m_manual(manualReset) { unsigned int nValue = 0; //初始化为无信号 int ret = sem_init(&m_event, 0, nValue); if ( 0 != ret ) { cout<<"sem_init failed"<<endl; } } CEventImpl::~CEventImpl() { sem_destroy(&m_event); } bool CEventImpl::WaitImpl() { int ret = sem_wait(&m_event); if ( 0 != ret ) { cout<<"CEventImpl::WaitImpl sem_wait failed"<<endl; } if ( m_manual ) { sem_post(&m_event); } return true; } bool CEventImpl::WaitImpl(long milliseconds) { if ( 0 == milliseconds ) { int ret = sem_trywait(&m_event); if ( 0 == ret ) { if ( m_manual ) { sem_post(&m_event); } } } else { int roopMax = milliseconds/10; do { usleep(10*1000); int ret = sem_trywait(&m_event); if ( 0 == ret ) { if ( m_manual ) { sem_post(&m_event); } break; } roopMax--; } while( roopMax > 0 ); } return true; }
类CEventImpl可以使用Linux平台用C++实现事件对象,同步线程或用C++实现Win32事件对象,同步线程中的测试代码对其进行测试。其结果是相同的。
原创作品,欢迎转载,麻烦带上链接:http://blog.csdn.net/chexlong/article/details/7100274 谢谢合作!
相关文章推荐
- delphi 多线程同步 互斥变量,信号量,事件对象。http://www.bianceng.cn/Programming/Delphi/200912/12689.htm
- 同步事件,信号量,互斥,临界区,线程,线程池C++实现(win32,linux)
- Linux信号量 sem_t简介
- 将 Windows IPC 应用程序移植到 Linux,第 2 部分: 信号量和事件
- Linux 信号量sem_t 简介 (线程)
- semExample.c(linux下信号量使用实例)
- Linux线程同步机制四--信号量sem
- 在Linux下信号量的semop操作的sembu结构体中sem_flag的设置值的含义
- Windows支持的4种类型的同步对象:临界区、互斥量、事件和信号量
- 临界区,互斥事件,互斥对象,信号量的区别
- 关于linux信号量的SEM_UNDO标志(防止死锁)
- linux开发:线程的面向对象封装
- Linux信号量的SEM_UNDO标志
- Linux下:POSIX内存对象映射+POSIX内存对象信号量
- Socket封装类(事件对象)
- Linux有名信号量的创建(sem_open中name参数构造)
- Linux进程间通信(IPC)编程实践(九)System V信号量---封装一个信号量操作的工具集
- 封装常用的跨浏览器的事件对象EventUtil
- 关于linux信号量的SEM_UNDO标志(防止死锁)
- Linux信号量sem_t简单实例运用