进程之间的锁机制。
本帖最后由 lemboyz 于 2011-05-13 14:40 编辑
线程之间有方便的线程锁、读写锁,进程之间可以用fcntl
写了个例子,供大家参考。
- // filename: proclock.hpp
- #include <errno.h>
- #include <iostream>
- #include <stdexcept>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- using namespace std;
- class CProcLock
- {
- private:
- int fd_;
- public:
- CProcLock(const string& filename);
- ~CProcLock() {
- unlock();
- close(fd_);
- }
- void writelock();
- void readlock();
- void unlock();
- };
复制代码
- // filename: proclock.cpp
- #include "proclock.hpp"
- CProcLock::CProcLock(const string& filename)
- {
- fd_ = open(filename.c_str(),O_RDWR,O_CREAT);
- if(fd_ == -1) {
- throw runtime_error(string("CProcLock() error,")+strerror(errno));
- }
- }
- void CProcLock::writelock()
- {
- struct flock lck;
- lck.l_type = F_WRLCK;
- lck.l_whence = SEEK_SET;
- lck.l_start = 0;
- lck.l_len = 0;
- if ( fcntl(fd_,F_SETLKW,&lck) == -1) {
- throw runtime_error(string("CProcLock::writelock() error,")+strerror(errno));
- }
- }
- void CProcLock::readlock()
- {
- struct flock lck;
- lck.l_type = F_RDLCK;
- lck.l_whence = SEEK_SET;
- lck.l_start = 0;
- lck.l_len = 0;
- if ( fcntl(fd_,F_SETLKW,&lck) == -1) {
- throw runtime_error(string("CProcLock::readlock() error,")+strerror(errno));
- }
- }
- void CProcLock::unlock()
- {
- struct flock lck;
- lck.l_type = F_UNLCK;
- lck.l_whence = SEEK_SET;
- lck.l_start = 0;
- lck.l_len = 0;
- if ( fcntl(fd_,F_SETLK, &lck) == -1) {
- throw runtime_error(string("CProcLock::unlock() error,")+strerror(errno));
- }
- }
复制代码
- // filename: main.cpp
- // for testing CProcLock
- #include <iostream>
- #include "proclock.hpp"
- using namespace std;
- int main(int argc,char ** argv)
- {
- if(argc != 4) {
- cout << "usage: " << argv[0] << " filename type[read|write] lock_seconds" << endl;
- return 0;
- }
- string file = argv[1];
- string type = argv[2];
- int sec = atoi(argv[3]);
- CProcLock lock(file);
- cout << "before lock()" << endl;
- if(type == "read")
- {
- lock.readlock();
- cout << "read locking." << endl;
- }
- else
- {
- lock.writelock();
- cout << "write locking." << endl;
- }
- sleep(sec);
- lock.unlock();
- cout << "lock finished." << endl;
- }
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
文件锁用在进程间同步还是很方便的。
进程之间通常没有共享内存,为什么要这样使用互斥锁?
资源互斥简单的检查x.lock文件是否存在就行了。
异步通知有管道,信号……