boost interprocess file_lock 实际上对目标文件做了什么?

What does boost interprocess file_lock actually do with the target file?

我已经阅读了一些关于 boost::interprocess::file_lock 的资料,它似乎做了很多我想要的事情(支持共享和独占锁定,并在进程崩溃或退出时解锁)。

有一件事我不确定,它对文件做了什么?我可以使用例如 0 字节长的文件吗? boost::interprocess 里面有写什么吗?还是所有系统都关心它的存在?

我已经使用 boost::interprocess 一段时间来可靠地内存映射文件并写入其中,现在我需要进行多进程处理并确保对该文件的读写受到保护; file_lock 看起来确实可行,我只是想知道我现在是否需要添加另一个文件以用作互斥体。

提前致谢

what does it do to the file?

Boost 不对文件执行任何操作,它依赖于操作系统来完成该工作。支持内存映射文件是请求分页虚拟内存操作系统的通用功能。喜欢 Windows、Linux、OSX。内存通常由分页文件支持,让它由您 select 的特定文件支持只是一小步。 Boost只是提供了一个独立于平台的适配器,仅此而已。

您需要查看相关的 OS 文档页面,以了解可能发生的情况以及在您执行异常操作时预期的工作方式。对于 Linux 和 OSX,您需要查看 mmap 手册页。 Windows 查看 CreatefileMapping.

file_lock does seem the way to go

是的,您几乎总是需要仲裁对内存映射文件的访问,因此例如一个进程只会在另一个进程完成写入数据时尝试读取数据。最合适的同步原语是 not a file_lock(OS 已经锁定了文件),它是一个命名互斥体。例如,使用 boost 的 named_mutex class.

请记住,这是一个非常的低级互操作机制,没有任何便利。当您添加所有必需的同步时,您已经完成了 OS 对命名管道或本地环回套接字所做的工作的一半。如果您发现必须将数据复制到映射视图中(这种情况并不少见,因为它不容易调整大小),那么您就失去了所有好处。