Boost进程间file_lock不能用于多个进程
boost interprocess file_lock does not work with multiple processes
我似乎有一个问题与boost::interprocess::file_lock
进程1实际上是
boost::interprocess::file_lock test_lock("testfile.csv");
test_lock.lock();
sleep(1000);
test_lock.unlock();
当我在第一个进程处于睡眠状态时运行第二个进程时,我发现我仍然能够读取testfile.csv。更糟糕的是,我甚至可以覆盖它。
我是否误解了file_lock的工作原理?在我的印象中,调用.lock()给了它对文件的独占锁,并阻止任何其他进程读取/修改文件。
file_lock不是用来锁定文件的。它是一个互斥对象,使用文件作为其支持技术。文件的内容基本上是不相关的;相关的是,指向该文件的file_lock的所有实例将尊重该锁的锁定特征。
与任何互斥类型的对象一样,锁本身是用来保护或测量对其他资源的访问的。与文件的文件系统保护没有关系。
参考为了确保可移植性,boost中不存在您期望的那种锁。在boost支持的Unix/Linux/OSX操作系统上没有内核级别的强制锁。
:
http://www.boost.org/doc/libs/1_51_0/doc/html/interprocess/synchronization_mechanisms.html interprocess.synchronization_mechanisms.file_lock
因此,boost进程间锁是一个建议或合作锁。您可以使用boost::interprocess::file_lock来完成您想要做的事情,但是,您还必须在其他可能尝试读/写文件的进程中使用interprocess::file_lock。只需在访问文件之前尝试在其他进程中获取锁即可。
这就是interprocess::file_lock的使用方式。如果你在某些操作系统上,你可以用一些特定于操作系统的方法来强制内核级锁定,但是如果你使用boost::interprocess::file_lock,你的代码将是可移植的。
这不是文件系统锁。
简单地锁定一个进程并不能阻止另一个进程访问该文件。可以把它想象成一个互斥锁。要使第二个进程执行file_lock,还需要在第二个进程中获取该锁。然后您将看到proc2将阻塞,等待proc1释放锁。
- 1d 智能指针不适用于语法 (*)++
- MPI一个计数器用于所有进程
- 使用C++将CPU专用于在1个核心上运行进程
- WIN 32 用于检测已启动和终止的应用程序/进程的 API
- Boost:是否存在用于仅线程通信的进程间消息队列机制
- QProcess::terminate() 不适用于简单的 Qt 应用程序作为 Windows XP 下的子进程
- Dll 注入器不适用于 x64 进程
- 文件重定向运算符">"不适用于创建进程() API
- GetModuleHandle(),用于另一个进程中的DLL
- C/C++标准函数,用于检查文件是否被其他进程使用
- Mac OS X等效于CreateEvent(),带有用于进程间通信的命名对象
- 用于启动和重新启动用户进程的Windows服务(带有GUI)
- 使用重定向输入和输出的c++进程间通信不适用于发布版本
- c++中有用于远程进程间通信的API吗?
- 用于后端c++进程的FastCGI或HTTP
- Boost::range用于处理容器的内容,并将映射中的值管道到下一个进程
- 是否有一种方法在试图写入文件的进程中生成错误?(用于测试目的)
- Boost进程间file_lock不能用于多个进程
- 更好的设计模式用于读取其他进程内存
- 创建进程不适用于所有应用程序