进程锁实现-有名信号量
来源:互联网 发布:哈希姆家族 知乎 编辑:程序博客网 时间:2024/06/15 09:35
说明:Linux平台
代码:
/** @file processlock.h* @brief 进程锁实现* @date 2015-4-15* @note 用有名信号量实现*/#pragma once#include <semaphore.h>using std::string;class CProcessLock{public: CProcessLock(); ~CProcessLock(); bool init(const char *pName); bool init(const string &name); void unInit(); void lock(); void unlock(); bool is_good();//锁是否已经创建完成private: sem_t *sem_;//信号量id char sem_name[64];//信号量名字 bool init_;//信号量初始化是否完成};
#include <unistd.h>#include <sys/sem.h>#include <fcntl.h>#include <errno.h>#include <string.h>#include <cstdio>#include <cstdlib>#include <string>#include "processlock.h"using std::string;#define OPEN_FLAG O_RDWR|O_CREAT#define OPEN_MODE 00777#define INIT_V 1CProcessLock::CProcessLock(){ init_ = false; memset(sem_name, 0, 64);}CProcessLock::~CProcessLock(){ unInit();}bool CProcessLock::init(const char *pName){ if(NULL == pName) return false; int nLen = strlen(pName); if(nLen > 64) { nLen = 64; } memcpy(sem_name, pName, nLen); sem_ = sem_open(sem_name, OPEN_FLAG, OPEN_MODE, INIT_V); if(sem_ == SEM_FAILED) { printf("create error:%d\n", errno); return false; } else { init_ = true; } return true;}bool CProcessLock::init(const string &name){ if(name.empty()) return false; int nLen = name.length(); if(nLen > 64) { nLen = 64; } memcpy(sem_name, name.c_str(), nLen); sem_ = sem_open(name.c_str(), OPEN_FLAG, OPEN_MODE, INIT_V); if(sem_ == SEM_FAILED) { printf("create error:%d\n", errno); return false; } else { init_ = true; } return true;}bool CProcessLock::is_good(){ return init_;}void CProcessLock::unInit(){ if(init_ && sem_!= NULL) { sem_unlink(sem_name);//删除系统中的信号量 sem_close(sem_);//销毁打开的信号量 } init_ = false; sem_ = NULL; memset(sem_name, 0, 64);}void CProcessLock::lock(){ sem_wait(sem_);}void CProcessLock::unlock(){ sem_post(sem_);}
//测试用例
/**进程锁测试用例编译:加锁:g++ -Wall -g -DUSE_LOCK -lrt -o test_processlock test_processlock.cpp processlock.cpp不加锁:g++ -Wall -g -lrt -o test_processlock test_processlock.cpp processlock.cpp*/#include <cstdio>#include <iostream>#include <sys/types.h>#include <sys/wait.h>#include "processlock.h"using namespace std;CProcessLock mylock;#define MAX_LEN 1000void print_log(const char *buf){#ifdef USE_LOCK mylock.lock();#endif for(int i=0; i<MAX_LEN; i++) { printf("%c ", buf[i]); fflush(stdout); usleep(2000); }#ifdef USE_LOCK mylock.unlock();#endif}int main(int argc, char *argv[]){#ifdef USE_LOCK mylock.init("mylock"); if(!mylock.is_good()) return 0;#endif pid_t pid = -1; int status = -1; pid = fork(); if(pid == 0) { //child process char buf[MAX_LEN]; int i=0; for(i=0; i<MAX_LEN-1; i++) { buf[i] = 'x'; } buf[i] = 0; print_log(buf); printf("\n"); return 0; } //parent process char buf[MAX_LEN]; int i=0; for(i=0; i<MAX_LEN-1; i++) { buf[i] = 'y'; } buf[i] = 0; print_log(buf); printf("\n"); wait(&status);#ifdef USE_LOCK mylock.unInit();#endif return 0;}
运行结果:不加锁时,子进程和父进程的字符交替出现,加锁后能够互斥输出。
参考:
http://blog.chinaunix.net/uid-20940095-id-66101.html
http://blog.csdn.net/ljianhui/article/details/10243617
http://www.oschina.net/code/snippet_237505_8646
0 0
- 进程锁实现-有名信号量
- <linux进程>POSIX有名信号量基本操作
- 使用共享实现两个进程之间的聊天-使用有名信号量实现同步
- 有名信号量
- 使用FIFO实现POSIX有名信号量
- 有名信号量实现消费者生产者问题
- 进程同步与互斥:POSIX有名信号量
- 进程同步与互斥:POSIX有名信号量
- linux中的进程通信-信号量和有名管道
- 信号量实现进程同步
- 有名信号量和共享内存实现同步聊天
- 有名信号量实现读者-写者问题(读者优先)
- 有名信号量实现读者-写着问题(公平读写)
- 有名管道实现进程间通信。
- 有名信号量的使用
- Linux进程通信 有名管道实现守护进程
- Linux系统编程——进程同步与互斥:POSIX有名信号量
- 【Linux系统编程】进程同步与互斥:POSIX有名信号量
- [ural1519]Formula 1 && 插头DP(括号表示法)
- 关押罪犯
- JS中&&和||用法
- OC 构造函数 alloc init
- HTML5 Canvas炫酷宇宙黑洞引力特效
- 进程锁实现-有名信号量
- Ubuntu使用(二):文件处理篇
- HTML5标签
- Linux软连接和硬链接
- 随笔
- javascript 杂谈之哪种写法你更喜欢?
- eclipse下手动利用hibernate连接数据库
- matlab路径问题
- 一些细节