2012-02-13 88 views
5

目前,我有2个使用message_queue和shared_memory格式boost进行通信的进程。一切都如工作。是boost :: interprocess线程安全吗?

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

我没有在boost文档上找到任何信息。顺便说一句,我使用提升1.40。

在此先感谢。

+0

您是否阅读过http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html? – 2012-02-13 20:18:15

回答

2

自boost ::进程间(共享存储器等)的共享资源要求您提供必要的同步。原因是你可能不需要同步,而且它通常在操作性能方面比较昂贵。

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

但是在一些例子中,你需要同步,就像上面的例子有多个编写器,或者如果你使用的是字符串数据而不是整数。有内部升压的各种同步机制(以及非升压的,但因为你已经在使用升压),描述如下:

[升压信息的稳定版本: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

具有共享存储器它是一种常见的做法是放置在共享存储器段,在那里它可以是匿名的基同步机构(意味着OS内核不提供访问它的名字)。通过这种方式,所有进程都知道如何锁定共享内存段,并且可以将锁与段关联(例如,如果您有多个段)

请记住,互斥量需要执行相同的线程解锁它,锁定它。如果您需要锁定和解锁来自不同执行线程的同步对象,则需要一个信号量。

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

+0

+1“因为这些值是整数(因此在您的平台上,读取和写入是原子的),并且您有一个写入它们的过程和几个读取它们的过程,所以此设计不需要同步。 – FaceBro 2017-08-22 02:04:59