Dav*_*e F 6 c++ boost boost-interprocess
我已经阅读了一些相关内容boost::interprocess::file_lock,它似乎做了我想要做的事情(支持共享和独占锁定,并在进程崩溃或退出时解锁)。
但我不确定的一件事是它对文件有什么作用?例如,我可以使用 0 字节长的文件吗?boost::interprocess里面写东西吗?或者系统只关心它的存在吗?
我现在已经使用了boost::interprocess一段时间来可靠地内存映射文件并写入文件,现在我需要进行多进程并确保对此文件的读取和写入受到保护;file_lock似乎是可行的方法,我只是想知道我现在是否需要添加另一个文件来用作互斥体。
提前致谢
它对文件有什么作用?
Boost 不会对文件执行任何操作,它依赖操作系统来完成该工作。对内存映射文件的支持是按需分页虚拟内存操作系统的通用功能。如 Windows、Linux、OSX。内存通常由页面文件支持,让您选择的特定文件支持内存只是一小步。Boost只是提供了一个独立于平台的适配器,仅此而已。
您需要查看相关的操作系统文档页面,以了解什么是可能的,以及当您执行不寻常的操作时它会如何工作。对于 Linux 和 OSX,您需要查看mmap手册页。对于 Windows,请查看CreatefileMapping.
file_lock 似乎是可行的方法
是的,您几乎总是需要仲裁对内存映射文件的访问,因此例如一个进程只会在另一个进程完成写入数据时尝试读取数据。最合适的同步原语不是file_lock(操作系统已经锁定文件),而是命名互斥体。例如,使用 boost 的named_mutex 类。
请记住,这是一个非常低级的互操作机制,并且没有任何便利。当您添加所有必需的同步时,您已经完成了操作系统使用命名管道或本地环回套接字所做的工作的一半。如果您发现必须将数据复制到映射视图中(这种情况并不罕见,因为它不容易调整大小),那么您就失去了所有好处。