多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式

其中临界区,互斥量,信号量算是严格意义的实现互斥操作的,事件应该说算是一种线程间的通信机制来保证互斥

在多线程中,可以直接将这些变量定义为全局的,然后在不同的线程中使用,那么多进程环境就不行了。

多进程如果要实现多共享资源的互斥操作,只能使用互斥量(Mutex)

Mutex分为命名和匿名互斥量,进程间只能使用命名方式。

windows下面的操作函数为:CreateMutex,WaitForSingleObject,ReleaseMutex,CloseHandle

linux下面的操作函数为:sem_open,sem_wait,sem_post,sem_close(关闭当前进程中的互斥量句柄,内核中仍然存在),sem_unlink(从内核中移除互斥量)

下面封装了一个跨平台实现多进程互斥操作的类,我自己测试过,可以拿来使用:

ProcessMutex.h文件:
 #ifndef __PROCESS_MUTEX_H__
#define __PROCESS_MUTEX_H__ #ifdef WIN32
#include <Windows.h>
#endif #ifdef linux
#include <unistd.h>
#include <semaphore.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <memory.h>
#endif class CProcessMutex
{
public:
/* 默认创建匿名的互斥 */
CProcessMutex(const char* name = NULL);
~CProcessMutex(); bool Lock();
bool UnLock(); private: #ifdef WIN32
void* m_pMutex;
#endif #ifdef linux
sem_t* m_pSem;
#endif
char m_cMutexName[];
}; #endif
ProcessMutex.cpp文件:
 #include "ProcessMutex.h"

 #ifdef WIN32

 CProcessMutex::CProcessMutex(const char* name)
{
memset(m_cMutexName, ,sizeof(m_cMutexName));
int min = strlen(name)>(sizeof(m_cMutexName)-)?(sizeof(m_cMutexName)-):strlen(name);
strncpy(m_cMutexName, name, min);
m_pMutex = CreateMutex(NULL, false, m_cMutexName);
} CProcessMutex::~CProcessMutex()
{
CloseHandle(m_pMutex);
} bool CProcessMutex::Lock()
{
//互斥锁创建失败
if (NULL == m_pMutex)
{
return false;
} DWORD nRet = WaitForSingleObject(m_pMutex, INFINITE);
if (nRet != WAIT_OBJECT_0)
{
return false;
} return true;
} bool CProcessMutex::UnLock()
{
return ReleaseMutex(m_pMutex);
} #endif #ifdef linux CProcessMutex::CProcessMutex(const char* name)
{
memset(m_cMutexName, ,sizeof(m_cMutexName));
int min = strlen(name)>(sizeof(m_cMutexName)-)?(sizeof(m_cMutexName)-):strlen(name);
strncpy(m_cMutexName, name, min);
m_pSem = sem_open(name, O_RDWR | O_CREAT, , );
} CProcessMutex::~CProcessMutex()
{
int ret = sem_close(m_pSem);
if ( != ret)
{
printf("sem_close error %d\n", ret);
}
sem_unlink(m_cMutexName);
} bool CProcessMutex::Lock()
{
int ret = sem_wait(m_pSem);
if (ret != )
{
return false;
}
return true;
} bool CProcessMutex::UnLock()
{
int ret = sem_post(m_pSem);
if (ret != )
{
return false;
}
return true;
} #endif

多进程之间的互斥信号量实现(Linux和windows跨平台)的更多相关文章

  1. 多进程之间的互斥信号量的实现(Linux和windows跨平台)

    最近工作中遇到了一些关于文件读取权限的问题.当一个程序中对一个固定名称的文件做了读写的操作的时候,外界通过并发式的调用这个应用的时候,可能存在多个进程同时去操作这个文件,这个时候可能会造成调用失败的问 ...

  2. 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>

    一.引子   开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...

  3. Linux 驱动——Button驱动6(mutex、NBLOCK、O_NONBLOCK)互斥信号量、阻塞、非阻塞

    button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...

  4. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  5. ucos之互斥信号量及优先级反转

    在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...

  6. Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型

    Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: ​ ​ ​ 每个对象都对应于一个可称为" 互斥锁&qu ...

  7. 设置共享,实现Linux和Windows之间的共享

    设置共享,实现Linux和Windows之间的共享 前提: 安装虚拟机.可以参考:在Windows上安装虚拟机详细图文教程 安装Linux.可以参考:在VMware Workstation里的Linu ...

  8. Linux和windows之间通过scp复制文件

    Windows是不支持ssh协议的 需要安装WinSSHD 安装以及设置过程如下: BvSshServer(原名winsshd)官方下载页在这里:https://www.bitvise.com/dow ...

  9. linux与linux,linux与windows之间用SSH传输文件

    linux与linux,linux与windows之间用SSH传输文件linux与linux之间传送文件:scp file username@hostIP:文件地址    例: scp abc.txt ...

随机推荐

  1. DB9 公头母头引脚定义及连接

    1.实物及引脚简单介绍 在做开发的时候常常会用到串行接口,一般9针的串行接口居多.例如以下图所看到的: 公头母头用于连接线的採用上图封装.但用于开发板的时候採用90度弯角插针的封装.例如以下图: 各引 ...

  2. 对CAB文件进行数字签名

    对CAB文件进行数字签名 传说中数字签名之后就能够不出现提示而自己主动下载,所以也试试: 在\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin 中间有三个小 ...

  3. U盘安装Win7 64位系统(笔记本+台式机亲测)

    准备工具: 1. Win7 64位系统的镜像文件(网上随便一搜即可,最好是纯净版,没有一堆乱七八糟的内置软件) 2. 4G以上的U盘一个 所用软件: 老毛桃(官网下载) 具体步骤: 1.数据备份(将原 ...

  4. android开发之Fragment加载到一个Activity中

    Fragments 是android3.0以后添加的.主要是为了方便android平板端的开发.方便适应不同大小的屏幕.此代码是为了最简单的Fragment的使用,往一个Activity中添加Frag ...

  5. MySQL · 特性分析 · innodb 锁分裂继承与迁移

    http://mysql.taobao.org/monthly/2016/06/01/ innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁 ...

  6. MAC SVN Phonegap

    1. Windows上用VisualSVN Server Manager创建好Repository. 2. 在MAC上,用Phonegap创建好项目,比如在Project1目录里的App目录. 3. ...

  7. Debian下的PPPOE服务器配置

    参考: http://blog.csdn.net/zhangwenjianqin/article/details/7655375 http://blog.sina.com.cn/s/blog_8043 ...

  8. 琐碎-关于StringTokenizer工具

    属于:java.util包 构造函数: 1. StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是“空格”.“制表 ...

  9. hashTable(哈希表)的基本用法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  10. Tomcat配置随笔

    启动内存参数的配置 tomcat/bin/catalina.bat 如果是linux 就是 catalina.sh 在rem 的后面增加如下参数 set JAVA_OPTS= -Xms256m -Xm ...