目前,我有 2 个进程使用 message_queue 和共享内存形式 boost 进行通信。一切都按参加的方式进行。
现在我需要使这个进程之一成为多线程(再次感谢boost),我想知道是否需要在线程之间使用保护机制(例如互斥体),或者boost::interprocess库是否已经提供了保护机制 ?
我在 boost 文档中没有找到任何相关信息。顺便说一句,我用的是boost 1.40。
提前致谢。
boost::interprocess 中的共享资源(共享内存等)要求您提供必要的同步。这样做的原因是您可能不需要同步,并且通常在操作性能方面会有些昂贵。
举例来说,您有一个进程以 32 位整数格式将某些内容的当前统计信息写入共享内存,还有一些进程读取这些值。由于这些值是整数(因此在您的平台上,读取和写入是原子的)并且您有一个写入它们的进程和几个读取它们的进程,因此此设计不需要同步。
然而,在某些示例中,您将需要同步,例如上面的示例有多个编写器,或者如果您使用字符串数据而不是整数。 boost 内部有各种同步机制(以及非 boost 同步机制,但由于您已经使用 boost),如下所述:
[稳定版本的提升信息:1.48]http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html 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_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线程库中的互斥体适用于具有多个线程的单个进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)