boost :: interprocess threadsafe?

时间:2012-02-13 19:41:05

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

目前,我有2个进程使用message_queue和shared_memory表单进行通信。一切都像参加者一样工作。

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

boost :: interprocess(共享内存等)的共享资源要求您提供必要的同步。这样做的原因是您可能不需要同步,并且它通常在某种程度上是昂贵的操作性能。

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

但是在某些示例中,您将需要同步,例如,如果上面的示例有多个编写器,或者您使用字符串数据而不是整数。 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 :(得分:1)