是boost::进程间线程安全的

Is boost::interprocess threadsafe?

本文关键字:安全 线程 进程 boost      更新时间:2023-10-16

目前,我有两个进程使用message_queue和shared_memory表单boost进行通信。一切如常。

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

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

提前谢谢。

boost::interprocess的共享资源(共享内存等)要求您提供必要的同步。这样做的原因是您可能不需要同步,而且从性能角度来看,这通常是一项成本较高的操作。

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

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

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

[您使用的版本的Boost信息: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线程库中用于具有多个线程的单个进程的互斥体相反。

您必须确保锁定共享资源。

您可以在boost文档中找到示例。例如:

http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_scoped_lock