参考链接
- Boost.Interprocess提供了两种类型的同步对象。
- 命名的实用程序。当两个进程想要创建这种类型的对象时,两个进程必须使用相同的名称创建或打开一个对象。这类似于创建或打开文件:一个进程使用名称为 filename 的 fstream 创建一个文件,另一个进程使用具有相同 filename 参数的另一个 fstream 打开该文件。每个进程都使用不同的对象来访问资源,但两个进程使用的是同一个底层资源。适用于不同进程之间对于相同文件的操作
- 匿名实用程序。由于这些实用程序没有名字,两个进程必须通过共享内存或内存映射文件来共享同一个对象。这与传统的线程同步对象类似。两个进程共享同一个对象 与线程同步不同的是,在线程同步中,同一进程的线程之间共享全局变量和堆内存,而来自不同进程的两个线程之间只能通过映射同一可映射资源的映射区域(例如共享内存或内存映射文件)共享对象。适用于同一进程不同线程之间对于相同文件的操作
- 每种类型都有自己的优缺点。
- 对于简单的同步任务来说,命名的实用程序更容易处理,因为两个进程都不需要创建一个共享内存区域并在那里构建同步机制。
- 当使用内存映射对象获得同步实用程序的自动持久化时,匿名实用程序可以被序列化到磁盘上。人们可以在内存映射的文件中构造一个同步实用程序,重新启动系统,再次映射文件,然后再次使用同步实用程序,而不会有任何问题。这一点在命名同步实用程序中是无法实现的。
- 命名实用程序和匿名实用程序的主要接口区别在于构造函数。通常匿名实用程序只有一个构造函数,而命名实用程序有多个构造函数,其第一个参数是请求创建、打开或打开或创建底层资源的特殊类型。
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(命名和匿名)
- 条件变量(命名和匿名)
- Semaphores (named and anonymous)
- 可升级的mutexes
- 文件锁