免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3287 | 回复: 2
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2011-05-13 14:24 |只看该作者
文件锁用在进程间同步还是很方便的。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP