【问题标题】:Is boost::interprocess threadsafe?boost::interprocess 线程安全吗?
【发布时间】:2012-03-05 05:32:52
【问题描述】:

目前,我有 2 个进程使用 message_queue 和 shared_memory 表单 boost 进行通信。一切照常工作。

现在我需要使这个进程之一成为多线程的(再次感谢 boost),我想知道是否需要在线程之间使用保护机制(例如互斥锁),或者 boost::interprocess 库是否已经提供保护机制?

我在 boost 文档中没有找到任何相关信息。顺便说一句,我使用的是 boost 1.40。

提前致谢。

【问题讨论】:

标签: c++ boost thread-safety boost-interprocess


【解决方案1】:

【讨论】:

  • 所以如果我理解正确的话,没有实施保护机制。您必须明确保护您的内存和队列。
【解决方案2】:

来自 boost::interprocess 的共享资源(共享内存等)要求您提供必要的同步。这样做的原因是您可能不需要同步,而且它通常在操作性能方面有点昂贵。

例如,假设您有一个进程以 32 位整数格式将某事物的当前统计信息写入共享内存,以及一些读取这些值的进程。由于这些值是整数(因此在您的平台上读取和写入是原子的),并且您只有一个进程写入它们,几个进程读取它们,因此此设计不需要同步。

但是,在某些示例中,您将需要同步,例如如果上面的示例有多个写入器,或者如果您使用的是字符串数据而不是整数。 boost 内部有各种同步机制(以及非 boost 的,但由于您已经在使用 boost),如下所述:

[稳定版本的提升信息:1.48] http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html

[提升您使用的版本信息:1.40] http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html

对于共享内存,将同步机制放在共享内存段的基础是一种常见的做法,它可以是匿名的(这意味着操作系统内核不提供通过名称对其进行访问)。这样所有进程都知道如何锁定共享内存段,并且您可以将锁与它们的段关联(例如,如果您有多个)

请记住,互斥锁需要相同的执行线程(在进程内)才能解锁它并锁定它。如果您需要从不同的执行线程锁定和解锁同步对象,则需要一个信号量。

如果您选择使用互斥锁,请确保它是进程间互斥锁 (http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html)与 boost 线程库中的互斥锁相反,它用于具有多个线程的单个进程。

【讨论】:

  • +1 表示“由于值是整数(因此在您的平台上读取和写入是原子的)并且您只有一个进程写入它们,并且有几个进程读取它们,因此不需要同步这个设计。”
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2013-09-24
  • 2011-12-30
  • 2011-09-16
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多