首先定义在多进程环境中的锁,采用读写锁,即可以同时读,但只能单独写。

头文件processLock.h

#ifndef PROCESSLOCK_H
#define PROCESSLOCK_H #include <pthread.h>
#include <dlfcn.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <cstring> class ProcessLock {
private:
pthread_rwlock_t _lock;
pthread_rwlockattr_t _attr;
ProcessLock();
void init();
static ProcessLock* processLock;
public:
int read();
int write();
int unlock();
static ProcessLock* createLock();
~ProcessLock();
}; #endif

源文件processLock.cpp

#include "processLock.h"

ProcessLock* ProcessLock::processLock = NULL;

void ProcessLock::init() {
//初始化读写锁的属性为进程共享,并与读写锁关联起来。
pthread_rwlockattr_init(&_attr);
pthread_rwlockattr_setpshared(&_attr, PTHREAD_PROCESS_SHARED);
pthread_rwlock_init(&_lock, &_attr);
} int ProcessLock::read() {
return pthread_rwlock_rdlock(&_lock);
} int ProcessLock::write() {
return pthread_rwlock_wrlock(&_lock);
} int ProcessLock::unlock() {
return pthread_rwlock_unlock(&_lock);
} ProcessLock* ProcessLock::createLock() {
//采用mmap实现指针的进程共享,这样在后续获取锁的时候,就是进程间共享的锁。
if (prorcessLock == NULL) {
processLock = (ProcessLock)mmap(NULL, sizeof(ProcessLock), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -, );
processLock->init();
}
return processLock;
} ProcessLock::~ProcessLock() {
pthread_rwlock_destroy(&_lock);
pthread_rwlockattr_destroy(&_attr);
}

实际应用:

#include "processLock.h"

int main() {
//child process read, main process write
ProcessLock* lock = ProcessLock::createLock();
pid_t fpid = fork();
if (fpid < ) {
cout << "fork error!" << endl;
exit();
} else if (fpid == ) {
cout << "child process" << endl;
lock->read();
//do read something
lock->unlock();
} else {
cout << "parent process" << endl;
lock->write();
//do write something
lock->unlock();
}
return ;
}

最新文章

  1. ExecutorService线程池
  2. Jprofile监控本地tomact
  3. performSelector和respondsToSelector用法
  4. 浅谈Excel开发:二 Excel 菜单系统
  5. linux命令行安装使用KVM
  6. operator
  7. POJ 1953
  8. WebSphere配置数据库连接池
  9. WebGL自学教程——WebGL演示样本:开始
  10. Linux防火墙配置—访问外网WEB
  11. 分别修改Cube每个面的贴图UV(Unity3D开发之十八)
  12. 21 re正则模块 垃圾回收机制
  13. windows 安装memchched和memcache教程
  14. 2019Java查漏补缺(二)
  15. vue day6 分页显示
  16. spring 5.1.2 mvc RequestMappingHandlerMapping 调用handler过程
  17. java数据
  18. dotnet core命令
  19. PythonStudy——三元表达式 Ternary expression
  20. 课堂讨论—Alpha版总结会议

热门文章

  1. 【JVM】吞吐量与延迟关系
  2. 日志数据如何同步到MaxCompute
  3. 七、单例设计模式共享数据分析、解决、call_once
  4. Spring中Configuration的理解
  5. java 字符串的操作方法
  6. Zlib not installed
  7. Excel中数字和字母混合时提取某些字符进行排序
  8. javaScript Queue
  9. python基本数据类型集合set操作
  10. 安装vue开发环境→安装淘宝镜像的时候报错