跨平台互斥体封装
#ifndef __SR_MUTEX_H__
#define __SR_MUTEX_H__#if (defined _WIN32 || defined _WIN64)
#define WIN32_LEAN_AND_MEAN //解决winsock.h和winsock2.h类型重定义问题#include "windows.h"#include "process.h"#include "atlstr.h"#define SR_Mutex CRITICAL_SECTION/*************************** 线程锁定义 ************************************/// 重新封装的互斥体类
class CSRMutex
{
public:// 构造函数CSRMutex();// 析构函数~CSRMutex();// 进入互斥锁void Lock();// 解锁void UnLock();
private:// win32下面是临界区 ,linux和apple下面是互斥锁SR_Mutex m_pMutex;
};#else
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/file.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include "SharedMemory.h"
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define SR_Mutex pthread_mutex_t// 重新封装的互斥体类
class CSRMutex
{
public:// 构造函数CSRMutex();// 析构函数~CSRMutex();// 进入互斥锁void Lock();// 解锁void UnLock();
private:// win32下面是临界区 ,linux和apple下面是互斥体SR_Mutex m_pMutex;
};#endif//end windows// 将互斥体的调用封装到一个锁中
class CSRLock
{
public:// win32 下面进入临界区 , linux和apple下面进入互斥锁状态CSRLock(CSRMutex * pMutex){m_pMutex = pMutex;if (NULL != pMutex){pMutex->Lock();}};
#ifdef _WIN32// 进程锁构造CSRLock(CString chszLockName){m_hProcMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, chszLockName.GetString());//打开进程锁if (m_hProcMutex == NULL){m_hProcMutex = CreateMutex(NULL, false, chszLockName.GetString());//创建进程锁}DWORD dw=WaitForSingleObject(m_hProcMutex, INFINITE);//获取进程锁if(dw != WAIT_OBJECT_0)printf("--------lock fail\r\n");};
#elseCSRLock(char* chszLockName){m_fp = fopen(chszLockName, "w+");if (m_fp == NULL ){printf("--------fp == NULL\r\n");}else{if (0 == flock(fileno(m_fp), LOCK_EX)){printf("--------lock success\r\n");}else{printf("--------lock fail\r\n");}}};
#endif// win32 下面出临界区 , linux和apple下面出互斥锁~CSRLock(){if (NULL != m_pMutex){m_pMutex->UnLock();}m_pMutex = NULL;#ifdef _WIN32// 进程锁析构if (NULL != m_hProcMutex){ReleaseMutex(m_hProcMutex);CloseHandle(m_hProcMutex);}m_hProcMutex = NULL;
#else{//unlockif (m_fp != NULL){if (0 == flock(fileno(m_fp), LOCK_UN)){printf("--------unlock success\r\n");}else{printf("--------unlock fail\r\n");}fclose(m_fp);}}
#endif};
private:// 临界区/互斥锁相关的成员变量CSRMutex * m_pMutex = NULL;
#ifdef _WIN32HANDLE m_hProcMutex = NULL;
#elseFILE* m_fp = NULL;#endif
};#endif
#include "SRMutex.h"/*************************** 线程锁定义 ************************************/
#if (defined _WIN32 || defined _WIN64)
/** @fn CSRMutex* @brief 构造函数* @return 见返回值类型说明*/
CSRMutex::CSRMutex()
{InitializeCriticalSection(&m_pMutex); };/** @fn ~CSRMutex* @brief 析构函数* @return 见返回值类型说明*/
CSRMutex::~CSRMutex()
{DeleteCriticalSection(&m_pMutex);};/** @fn Lock* @brief 进入锁状态* @return 见返回值类型说明*/
void CSRMutex::Lock()
{EnterCriticalSection(&m_pMutex);};/** @fn UnLock* @brief 解锁* @return 见返回值类型说明*/
void CSRMutex::UnLock()
{LeaveCriticalSection(&m_pMutex);};#elseCSRMutex::CSRMutex()
{int ret = 0;pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); //嵌套锁ret = pthread_mutex_init(&m_pMutex, &attr);pthread_mutexattr_destroy(&attr);//释放属性if (ret != 0){m_pMutex = PTHREAD_MUTEX_INITIALIZER;}};/** @fn ~CSRMutex
* @brief 析构函数
* @return
见返回值类型说明
*/
CSRMutex::~CSRMutex()
{pthread_mutex_destroy(&m_pMutex);
};/** @fn Lock
* @brief 进入锁状态
* @return
见返回值类型说明
*/
void CSRMutex::Lock()
{pthread_mutex_lock(&m_pMutex);
};/** @fn UnLock
* @brief 解锁
* @return
见返回值类型说明
*/
void CSRMutex::UnLock()
{pthread_mutex_unlock(&m_pMutex);
};#endif//end windows
当需要进程同步时,可构造进程锁(提供一个锁名称),如果是线程同步,可构造线程锁(提供一个互斥体)。