是boost::进程间线程安全的
Is boost::interprocess threadsafe?
目前,我有两个进程使用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
- 从不同线程使用int64的不同字节安全吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- 线程调用的函数对对象删除是否安全?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具