多进程之间的互斥信号量实现(Linux和windows跨平台)
2014-05-13 18:32
579 查看
多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式
其中临界区,互斥量,信号量算是严格意义的实现互斥操作的,事件应该说算是一种线程间的通信机制来保证互斥
在多线程中,可以直接将这些变量定义为全局的,然后在不同的线程中使用,那么多进程环境就不行了。
多进程如果要实现多共享资源的互斥操作,只能使用互斥量(Mutex)
Mutex分为命名和匿名互斥量,进程间只能使用命名方式。
windows下面的操作函数为:CreateMutex,WaitForSingleObject,ReleaseMutex,CloseHandle
linux下面的操作函数为:sem_open,sem_wait,sem_post,sem_close(关闭当前进程中的互斥量句柄,内核中仍然存在),sem_unlink(从内核中移除互斥量)
下面封装了一个跨平台实现多进程互斥操作的类,我自己测试过,可以拿来使用:
其中临界区,互斥量,信号量算是严格意义的实现互斥操作的,事件应该说算是一种线程间的通信机制来保证互斥
在多线程中,可以直接将这些变量定义为全局的,然后在不同的线程中使用,那么多进程环境就不行了。
多进程如果要实现多共享资源的互斥操作,只能使用互斥量(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[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_RDWR | 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
相关文章推荐
- Linux下信号量实现进程同步、互斥(生产者消费者问题)
- Linux下进程之间信号量互斥、同步
- linux 命名信号量实现进程间的互斥与同步
- 使用SAMBA协议实现Linux与Windows系统之间的文件共享
- 跨平台多线程、互斥器、信号量实现
- 项目总结(四)----------Python实现Windows和Linux之间互相传输文件(文件夹)
- Samba服务搭建实现Windows与Linux系统之间资源共享
- UDP实现linux与Windows之间数据传输
- 实现windows与linux之间的文件传输
- 实现虚拟机linux和主机windows之间的文件互传
- 不同系统平台之间(Linux与Linux、Linux与Unix)利用NFS实现文件共享方法
- 记linux与Windows之间实现文件实时同步的方案
- Python实现Windows和Linux之间互相传输文件(文件夹)的方法
- (已解决)在linux的虚拟机上安装vmware tools(实现windows与虚拟机之间的文件交互复制粘贴)
- 如何实现windows和linux之间的文件传输
- Windows平台下的进程/线程的同步与互斥
- Linux与windows之间实现文件共享
- 利用SSH secure Shell实现windows与linux之间传输文件
- WINDOWs平台,利用CreateProcess实现进程复制
- 【Linux】线程总结:线程同步 -互斥锁,条件变量,信号量实现多生产者多消费者模型