/*
* @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
同步事件,信号量,互斥,临界区,线程,线程池C++实现(win32,linux)
最新推荐文章于 2022-10-04 01:29:00 发布
这是一个C++库,用于在Win32和Linux环境下实现多线程同步,包括事件、信号量、互斥量、临界区、线程和线程池。通过类接口,提供了跨平台的同步对象操作,如上锁、等待、解锁等。
摘要由CSDN通过智能技术生成