进程之间的锁机制。

发布于 2022-10-15 07:05:32 字数 4583 浏览 20 评论 0

本帖最后由 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. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情泪▽动烟 2022-10-22 07:05:32

文件锁用在进程间同步还是很方便的。

小帐篷 2022-10-22 07:05:32

进程之间通常没有共享内存,为什么要这样使用互斥锁?
资源互斥简单的检查x.lock文件是否存在就行了。
异步通知有管道,信号……

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文