免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3012 | 回复: 2

进程之间的锁机制。 [复制链接]

论坛徽章:
0
发表于 2011-05-13 14:18 |显示全部楼层
本帖最后由 lemboyz 于 2011-05-13 14:40 编辑

线程之间有方便的线程锁、读写锁,进程之间可以用fcntl

写了个例子,供大家参考。

  1. // filename: proclock.hpp

  2. #include <errno.h>
  3. #include <iostream>
  4. #include <stdexcept>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. using namespace std;

  9. class CProcLock
  10. {
  11. private:
  12.     int fd_;

  13. public:
  14.     CProcLock(const string& filename);
  15.     ~CProcLock() {
  16.         unlock();
  17.         close(fd_);
  18.     }

  19.     void writelock();
  20.     void readlock();
  21.     void unlock();
  22. };
复制代码

  1. // filename: proclock.cpp

  2. #include "proclock.hpp"

  3. CProcLock::CProcLock(const string& filename)
  4. {
  5.     fd_ = open(filename.c_str(),O_RDWR,O_CREAT);
  6.     if(fd_ == -1) {
  7.         throw runtime_error(string("CProcLock() error,")+strerror(errno));
  8.     }
  9. }

  10. void CProcLock::writelock()
  11. {
  12.     struct flock lck;
  13.     lck.l_type = F_WRLCK;
  14.     lck.l_whence = SEEK_SET;
  15.     lck.l_start = 0;
  16.     lck.l_len = 0;
  17.     if ( fcntl(fd_,F_SETLKW,&lck) == -1) {
  18.         throw runtime_error(string("CProcLock::writelock() error,")+strerror(errno));
  19.     }
  20. }

  21. void CProcLock::readlock()
  22. {
  23.     struct flock lck;
  24.     lck.l_type = F_RDLCK;
  25.     lck.l_whence = SEEK_SET;
  26.     lck.l_start = 0;
  27.     lck.l_len = 0;
  28.     if ( fcntl(fd_,F_SETLKW,&lck) == -1) {
  29.         throw runtime_error(string("CProcLock::readlock() error,")+strerror(errno));
  30.     }
  31. }

  32. void CProcLock::unlock()
  33. {
  34.     struct flock lck;
  35.     lck.l_type = F_UNLCK;
  36.     lck.l_whence = SEEK_SET;
  37.     lck.l_start = 0;
  38.     lck.l_len = 0;
  39.     if ( fcntl(fd_,F_SETLK, &lck) == -1) {
  40.         throw runtime_error(string("CProcLock::unlock() error,")+strerror(errno));
  41.     }
  42. }
复制代码

  1. // filename: main.cpp
  2. // for testing CProcLock

  3. #include <iostream>
  4. #include "proclock.hpp"
  5. using namespace std;

  6. int main(int argc,char ** argv)
  7. {
  8.     if(argc != 4) {
  9.         cout << "usage: " << argv[0] << " filename type[read|write] lock_seconds" << endl;
  10.         return 0;
  11.     }

  12.     string file = argv[1];
  13.     string type = argv[2];
  14.     int sec = atoi(argv[3]);

  15.     CProcLock lock(file);

  16.     cout << "before lock()" << endl;
  17.     if(type == "read")
  18.     {
  19.         lock.readlock();
  20.         cout << "read locking." << endl;
  21.     }
  22.     else
  23.     {
  24.         lock.writelock();
  25.         cout << "write locking." << endl;
  26.     }

  27.     sleep(sec);
  28.     lock.unlock();
  29.     cout << "lock finished." << endl;

  30. }
复制代码

论坛徽章:
0
发表于 2011-05-13 14:24 |显示全部楼层
文件锁用在进程间同步还是很方便的。

论坛徽章:
0
发表于 2011-05-13 17:06 |显示全部楼层
进程之间通常没有共享内存,为什么要这样使用互斥锁?
资源互斥简单的检查x.lock文件是否存在就行了。
异步通知有管道,信号……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP