gpt4 book ai didi

c++ - boost::interprocess 线程安全吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:17 27 4
gpt4 key购买 nike

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

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

我没有在 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 线程库中的互斥锁相反,后者适用于具有多个线程的单个进程。

关于c++ - boost::interprocess 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9266895/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com