首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是boost::interprocess threadsafe吗?

是boost::interprocess threadsafe吗?
EN

Stack Overflow用户
提问于 2012-02-14 03:41:05
回答 2查看 2.7K关注 0票数 5

目前,我有两个使用message_queue和shared_memory form boost进行通信的进程。一切都在有人照看的情况下工作。

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

我在boost文档中没有找到任何关于这方面的信息。顺便说一下,我使用的是boost 1.40。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-02-17 09:22:57

来自boost::interprocess (共享内存等)的共享资源要求您提供必要的同步。这样做的原因是,您可能不需要同步,而且这通常是一种有点昂贵的操作性能。

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

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

Boost info for stable version: 1.48

Boost info for version your using: 1.40

对于共享内存,通常的做法是将同步机制放在共享内存段的基础上,在那里它可以是匿名的(这意味着操作系统内核不按名称提供对它的访问)。这样,所有进程都知道如何锁定共享内存段,并且您可以将锁与它们的段关联起来(例如,如果您有多个段)

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-02-14 04:26:33

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9266895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档