Boost interprocess file_lock跨进程同步失效问题排查
Boost file_lock跨进程同步失效问题排查
我尝试用Boost的file_lock实现两个进程间的同步控制:
进程1代码:
#include <boost/interprocess/sync/file_lock.hpp> #include <fstream> #include <chrono> #include <thread> int main() { std::string lock_path = "lockfile"; std::ofstream stream(lock_path, std::ios::app); boost::interprocess::file_lock lock(lock_path.c_str()); if (lock.try_lock()) { std::this_thread::sleep_for(std::chrono::seconds(30)); } return 0; }
进程1获取锁后会休眠30秒,此时启动进程2尝试获取同一锁,进程2代码:
#include <boost/interprocess/sync/file_lock.hpp> #include <iostream> int main() { boost::interprocess::file_lock lock("lockfile"); if (lock.try_lock()) { std::cout << "got here" << std::endl; } return 0; }
预期进程2无法获取锁,不会输出"got here",但实际却成功输出。请问我忽略了什么?file_lock是否不能这样使用?
问题原因与解决方法
核心问题:锁文件的关联文件流提前关闭
进程1中创建的std::ofstream stream是局部变量,在file_lock构造完成后,这个流对象会被立即销毁,对应的文件描述符随之关闭。而Boost的file_lock依赖底层文件系统的锁机制,多数系统(如Linux的fcntl锁)要求持有锁的进程必须保持文件处于打开状态,一旦文件描述符关闭,内核会自动释放该进程持有的锁。这直接导致进程1的锁在休眠前就被释放,进程2自然能成功获取锁。解决方法
保持锁文件的打开状态,直到锁被释放为止。修改进程1的代码,让std::ofstream的生命周期覆盖锁的持有时间:
#include <boost/interprocess/sync/file_lock.hpp> #include <fstream> #include <chrono> #include <thread> int main() { std::string lock_path = "lockfile"; // 保持stream的生命周期,直到锁释放后再销毁 std::ofstream stream(lock_path, std::ios::app); boost::interprocess::file_lock lock(lock_path.c_str()); if (lock.try_lock()) { std::this_thread::sleep_for(std::chrono::seconds(30)); // 显式释放锁(可选,对象销毁时也会自动释放) lock.unlock(); } // stream在main函数结束时才销毁,此时锁已处理完毕 return 0; }
额外注意事项:
- 确保两个进程操作完全相同路径的锁文件,避免因进程启动目录不同导致相对路径指向不同文件。
- 不同操作系统的文件锁机制存在差异,
file_lock是对系统原生锁的封装,需遵循对应系统的锁规则,但保持文件打开是通用的必要条件。
内容的提问来源于stack exchange,提问作者hbnoory
相关产品推荐
相关产品推荐

