该文章学习翻译Boost Interprocess 模块中synchronization_mechanisms_overview 一节,欢迎交流指正,谢谢。
命名Named和匿名Anonymous同步机制
Boost interprocess进程间同步提供了两种同步对象:
命名工具: 两个进程试图创建命名工具时,必须使用相同的名字创建/打开该对象。这类似于一个进程使用fstream 创建一个命名文件,另一个进程需要使用fstream 以相同的名称打开该文件,每个进程使用不同的对象访问公共资源, 但两者使用了相同的基础资源。
匿名工具:由于这类工具没有名称,两个进程必须使用通过共享内存区域(shared memory)或者内存映射文件(memory mapped files)使用同一个工具对象,这类似于传统的线程同步方式,两个进程使用同一个对象,但与同一进程的不同线程共享全局变量和堆内存的同步方式并不相同,来自两个进程的不同线程只能通过将共享工具对象映射至内存区域使用。
每种方式都有各自的优势和劣势:
命名工具: 简单、易于实现,因为两个进程并不需要创建共享的内存区域来构造该同步机制。
匿名工具: 在使用内存映射对象时能够被序列化值磁盘, 从而自动获得持久性的同步工具,用户可以创建一个同步工具至内存映射文件,重启系统后再次映射至该文件, 仍然可以使用该同步工具而不引起任何问题,这是命名工具无法实现的。
命名工具和匿名工具的主要接口差异在于其构造函数,通常匿名工具只有一种构造方法,而命名工具有多种构造方法,且构造时通过第一个特殊参数表示创建、打开、创建或打开共同的基础资源。
using namespace boost::interprocess;
//Create the synchronization utility. If it previously exists, throws an error
NamedUtility(create_only, ...)
//Open the synchronization utility. If it does not previously exist, it's created.
NamedUtility(open_or_create, ...)
//Open the synchronization utility. If it does not previously exist, throws an error.
NamedUtility(open_only, ...)
using namespace boost::interprocess;
//Create the synchronization utility.
AnonymousUtility(...)
Boost interprocess 提供了一下几种同步工具:(系列文章中逐渐学习翻译)
- 互斥量Mutexes (named and anonymous)
- 条件变量Condition variables (named and anonymous)
- 信号量Semaphores (named and anonymous)
- 升级互斥量Upgradable mutexes
- 文件锁File locks