多进程之间的互斥信号量的实现(Linux和windows跨平台)
最近工作中遇到了一些关于文件读取权限的问题。当一个程序中对一个固定名称的文件做了读写的操作的时候,外界通过并发式的调用这个应用的时候,可能存在多个进程同时去操作这个文件,这个时候可能会造成调用失败的问题。所以这个时候,在操作文件之前就应该给该操作加锁,遵循先来先行,后来等待的效果,从而保证各个进程都能够正常的执行自己的功能。
对于单个进程来说,进程内部的多个线程之间实现互斥的功能就方法很多,临界区(CriticalSection),互斥量(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
set_t* m_pSem;
#ednif
char m_cMutexName[30];
};
#endif
//ProcessMutex.cpp文件:
#include "ProcessMutex.h"
#ifdef WIN32
CProcessMutex::CProcessMutex(const char* name)
{
memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):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, 0 ,sizeof(m_cMutexName));
int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
strncpy(m_cMutexName, name, min);
m_pSem = sem_open(name, O_CREAT, 0644, 1);
}
CProcessMutex::~CProcessMutex()
{
int ret = sem_close(m_pSem);
if (0 != ret)
{
printf("sem_close error %d\n", ret);
}
sem_unlink(m_cMutexName);
}
bool CProcessMutex::Lock()
{
int ret = sem_wait(m_pSem);
if (ret != 0)
{
return false;
}
return true;
}
bool CProcessMutex::UnLock()
{
int ret = sem_post(m_pSem);
if (ret != 0)
{
return false;
}
return true;
}
#endif
//使用方式
CProcessMutex pMutex("MutexName");
pMutex.Lock();
//互斥内容或者函数
pMutex.UnLock()
这个只是最近工作中的一点收获,也算是自己的知识库也多了一点东西。
多进程之间的互斥信号量的实现(Linux和windows跨平台)的更多相关文章
- 多进程之间的互斥信号量实现(Linux和windows跨平台)
多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式 其中临界区,互斥量,信号量算是严格意义的实现 ...
- 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>
一.引子 开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...
- Linux 驱动——Button驱动6(mutex、NBLOCK、O_NONBLOCK)互斥信号量、阻塞、非阻塞
button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...
- Linux多进程之间的文件锁
之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作.故想到了文件锁. Linux下可以使用flock()函数对文件进行加锁解锁等操作.简单介绍下flock()函数: 表头 ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- ucos之互斥信号量及优先级反转
在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- 设置共享,实现Linux和Windows之间的共享
设置共享,实现Linux和Windows之间的共享 前提: 安装虚拟机.可以参考:在Windows上安装虚拟机详细图文教程 安装Linux.可以参考:在VMware Workstation里的Linu ...
- Linux和windows之间通过scp复制文件
Windows是不支持ssh协议的 需要安装WinSSHD 安装以及设置过程如下: BvSshServer(原名winsshd)官方下载页在这里:https://www.bitvise.com/dow ...
随机推荐
- git的使用(win7 64位)
下载安装 1.官方下载网址:https://git-scm.com/downloads: 2.安装十分简单,按照默认配置,一直点击next,最后点击install,即安装成功: 3.安装成功之后,则自 ...
- 为什么Java大数据能带你走上人生巅峰
国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发. 开发程序员的工作大多是重复性劳动,容易产生疲惫感,薪资在工作2-5年内就达到了一个峰值,再要提升就比较困 ...
- Java学习第一天之简单了解java语言及开发环境的安装
一.初步了解Java语言 Java语言是由Sun公司的James Gosling创造的一门面向对象的高级语言. 2009年4月20日,Sun公司被Oracle以总价值约为74亿美元的价格收购,Java ...
- libssh2--ssh2实例
#include "libssh2_config.h"#include<libssh2.h>#include<libssh2_sftp.h> 上述为所包含必 ...
- 9.jsonp的实现原理
1. 由于浏览器的安全性限制,不允许AJAX访问 协议不同.域名不同.端口号不同的数据接口,浏览器认为这种访问不安全:2. 以通过动态创建script标签的形式,把script标签的src属性,指向数 ...
- Vue 日期下拉框
<!-- html --> <template> <!-- 控件样式 --> <div class="select"> <di ...
- 标准键盘 acsii码值 表
码值 含义 备注 0x08 Backspace键 0x09 Tab键 0x0C Clear键 Num Lock关闭时的数字键盘5 0x0D Enter键 0x10 Shift键 0x1 ...
- 陈硕muduo
https://github.com/chenshuo/muduo muduo 阅读 https://www.cnblogs.com/qbits/p/11101678.html
- [Visual Studio] 问题:VS下运行项目时,检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
vs2012调试时默认会是集成模式,vs2012调试时怎么使用传统模式哪? 这个时候只要选中启动项目按F4,在托管管道模式里选传统模式即可!
- Python中的基本类型简介
1.变量 变量不仅可以是数字,还可以是任意数据类型 命名规范:变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线_的组合,且不能用数字开头 python中等号“=”是赋值语句,可以把任意数据 ...