boost官方文档同步机制Synchronization mechanisms overview

参考链接

Synchronization mechanisms overview

  • Named And Anonymous Synchronization Mechanisms
  • Types Of Synchronization Mechanisms
  • 如前所述,如果不能有效地同步对内存的访问,那么通过内存映射文件或共享内存对象在进程之间共享内存的能力就不是很有用。这和线程同步机制的问题是一样的,线程之间共享堆内存和全局变量,但对这些资源的访问通常需要通过mutex和条件变量进行同步。Boost.Threads实现了同一进程内线程之间的这些同步工具。Boost.Interprocess实现了类似的机制来同步不同进程的线程。

Named And Anonymous Synchronization Mechanisms

  • 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
  • 文件锁
上一篇:LTE同步技术(一)


下一篇:Locks and Synchronization锁与同步