5

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

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

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

提前致谢。

4

2 回答 2

3

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线程库中的互斥锁,用于具有多个线程的单个进程。

于 2012-02-17T01:22:57.267 回答
1

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

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

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

于 2012-02-13T20:26:32.610 回答