当前位置: 首页 > news >正文

跨平台互斥体封装

#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

当需要进程同步时,可构造进程锁(提供一个锁名称),如果是线程同步,可构造线程锁(提供一个互斥体)。


http://www.mrgr.cn/news/27017.html

相关文章:

  • 数据结构:单链表
  • 前端必知必会-响应式网页设计Viewport和GridView
  • 家庭理财管理系统
  • 【极限、数学】 NOIP 2018 提高组初赛试题 第 7 题详解(线段长度期望)
  • 【代码随想录训练营第42期 Day58打卡 - 图论Part8 - 拓扑排序
  • 【免费资料推荐】数据资产管理实践白皮书(6.0版)
  • 每天五分钟玩转深度学习PyTorch:模型参数优化器torch.optim
  • 智能工厂的设计软件 之 语言设计
  • 【Jetson】Jetson Orin NX刷机教程
  • nacos和eureka的区别详解
  • Linux sh命令
  • 完结马哥教育SRE课程--就业篇
  • 基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(带Qt界面)
  • 微型导轨加工环境需避免的隐患!
  • 什么是蜘蛛池?有什么作用
  • SpringBoot整合WebSocket实现消息推送或聊天功能示例
  • 数据库系统 第57节 数据库迁移
  • 喜报 | 大势智慧荣获国家级专精特新重点“小巨人”企业荣誉称号
  • F12抓包11:UI自动化 - Recoder(记录器)
  • React源码学习(一):如何学习React源码