同步事件,信号量,互斥,临界区,线程,线程池C++实现(win32,linux)

这是一个C++库,用于在Win32和Linux环境下实现多线程同步,包括事件、信号量、互斥量、临界区、线程和线程池。通过类接口,提供了跨平台的同步对象操作,如上锁、等待、解锁等。
摘要由CSDN通过智能技术生成
/*
* @note		:同步事件/信号量/互斥/临界区/线程/线程池实现(win32/linux),不支持unicode
* @author	:Andy.Ro
* @email	:Qwuloo@qq.com
*/
#ifndef _XTHREAD_H_INCLUDE_
#define _XTHREAD_H_INCLUDE_

#ifdef WIN32
#include <Windows.h>
#include <process.h>
#else
// linux 手测参考:http://www.mkssoftware.com/docs
#include <sched.h>
#include <pthread.h>
#include <semaphore.h> // POSIX信号量(用户态)
//#include <sys/sem.h>   // SYSTEM V信号量(用户态)
#include <sys/types.h>
#include <unistd.h>
#define INFINITE 0xFFFFFFFF
#endif

#include "../Interface/xTypes.h"

#ifdef WIN32
typedef u32_t pthread_t;
#endif

namespace ESMT {

	class xSyncObject;
	class xEvent;					// 事件内核对象
	class xSemaphore;				// 信号量内核对象:linux 下仅实现了POSIX信号量
	class xMutex;					// 互斥内核对象
	class xSection;					// 临界区用户对象

	class xThread;					// 线程类
	class xThreadPool;				// 线程池

	//------------------------------------------------------------------------
	// xSyncObject 接口类
	//------------------------------------------------------------------------
	class xSyncObject
	{
	public:
		xSyncObject(void);
	
	public:
		// @note: 上锁
		virtual BOOL lock(void)							/*= 0;*/ { return FALSE; }
		
		// @note: 挂起调用线程,直到该内核对象被解锁
		// @param timeout <ulong_t> : 等待时间(毫秒)
		virtual BOOL wait(ulong_t timeout = INFINITE)	/*= 0;*/ { return FALSE; }
		
		// @note: 解锁
		virtual BOOL Unlock(void)						/*= 0;*/ { return FALSE; }
		
		// @note: 占用资源并进入访问
		virtual BOOL enter(void)						/*= 0;*/ { return FALSE; }

		// @note: 离开并释放占用资源
		virtual BOOL leave(void)						/*= 0;*/ { return FALSE; }

	public:
		virtual ~xSyncObject(void);
	};

	//------------------------------------------------------------------------
	// xEvent 多线程事件同步
	// linux 下参考:http://blog.csdn.net/ffilman/article/details/4871920
	//------------------------------------------------------------------------
	class xEvent : public xSyncObject
	{
#define		__signaled(e)		( (e).unlock() )
#define		__nonsignaled(e)	( (e).lock()   )
#define		__wait_signal(e,s)	( (e).wait(s)  )
	public:
		xEvent(
			BOOL initstate = FALSE, BOOL manualreset = FALSE
#ifdef WIN32
		   ,LPCTSTR lpName = NULL, LPSECURITY_ATTRIBUTES lpsa = NULL
#else
		   ,u32_t pshared = PTHREAD_PROCESS_PRIVATE
		   ,u32_t type = PTHREAD_MUTEX_TIMED_NP
#endif
			);
	public:
		// @note: 设置事件未受信(non-signaled)状态[人工重置(manual-reset)事件]
		/*inline*/ BOOL lock();
		
		// @note: 挂起调用线程,直到该事件对象受信(signaled)
		// @param timeout <ulong_t> : 等待时间(毫秒)
		/*inline*/ BOOL wait(ulong_t timeout = INFINITE);
		
		// @note: 设置事件受信(signaled)状态
		/*inline*/ BOOL unlock();
	
	public:
#ifdef WIN32
		HANDLE _event;
#else
#if 0
		typedef struct _cond_check_t
		{
			typedef BOOL (*cond_check_callback_func)(void * args);
			cond_check_callback_func _handler;
			void * _args;
		}cond_check_t;
		cond_check_t _cond_check;
#endif
		pthread_mutex_t _mutex;
		pthread_cond_t _cond;
		BOOL _manual_reset,_signaled;
#endif
	public:
		~xEvent(void);
	};

	//------------------------------------------------------------------------
	// xSemaphore,控制多线程对同一共享资源的并发访问
	// linux  下参考:http://blog.csdn.net/qinxiongxu/article/details/7830537
	//------------------------------------------------------------------------
	class xSemaphore : public xSyncObject
	{
	public:
		// @note:构造信号内核对象 
		// @param initvalue <ulong_t> : 初始可用访问资源计数
		// @param maxvalue  <ulong_t> : 允许最大访问资源计数,指定并发访问共享资源的最大线程数
		xSemaphore(ulong_t initvalue = 1
#ifdef WIN32
			,ulong_t maxvalue = 1
#endif
			,char const * name = NULL);
	
	public:	
		// @note: 占用资源并进入访问
		/*inline*/ BOOL enter();
		
		// @note: 离开并释放占用资源
		/*inline*/ BOOL leave();
	
	public:
#ifdef WIN32
		HANDLE _sem;
#else
		sem_t  _sem,*_p_sem;
		std::string _S_NAME;
#endif
	public:
		~xSemaphore(void);
	};

	//------------------------------------------------------------------------
	// xMutex 控制多线程对同一共享资源的互斥访问
	//------------------------------------------------------------------------
	class xMutex : public xSyncObject
	{
	public:
		xMutex(
#ifdef WIN32
			 LPCTSTR lpName = NULL, BOOL bInitOwner = FALSE, LPSECURITY_ATTRIBUTES lpsa = NULL
#else
			 u32_t pshared = PTHREAD_PROCESS_PRIVATE
			,u32_t type = PTHREAD_MUTEX_TIMED_NP
#endif
			);
	
	public:
		// @note: 占用资源并互斥访问
		/*inline*/ BOOL enter();
		
		// @note: 离开并释放占用资源
		/*inline*/ BOOL leave();
	
	public:
#ifdef WIN32
		HANDLE          _mutex;
#else
		pthread_mutex_t _mutex;
#endif
	public:
		~xMutex(void);
	};

	//------------------------------------------------------------------------
	// xSection,多线程访问临界资源
	//------------------------------------------------------------------------
	class xSection : public xSyncObject
	{
	public:
		xSection(
#ifdef WIN32
#else
			 u32_t pshared = PTHREAD_PROCESS_PRIVATE
			,u32_t type = PTHREAD_MUTEX_TIMED_NP
#endif
			);
	
	public:
		// @note
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值