c++ fork进程与同步锁
2024-09-06 01:39:51
首先定义在多进程环境中的锁,采用读写锁,即可以同时读,但只能单独写。
头文件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 ;
}
最新文章
- ExecutorService线程池
- Jprofile监控本地tomact
- performSelector和respondsToSelector用法
- 浅谈Excel开发:二 Excel 菜单系统
- linux命令行安装使用KVM
- operator
- POJ 1953
- WebSphere配置数据库连接池
- WebGL自学教程——WebGL演示样本:开始
- Linux防火墙配置—访问外网WEB
- 分别修改Cube每个面的贴图UV(Unity3D开发之十八)
- 21 re正则模块 垃圾回收机制
- windows 安装memchched和memcache教程
- 2019Java查漏补缺(二)
- vue day6 分页显示
- spring 5.1.2 mvc RequestMappingHandlerMapping 调用handler过程
- java数据
- dotnet core命令
- PythonStudy——三元表达式 Ternary expression
- 课堂讨论—Alpha版总结会议