ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 这些Boost :: Interprocess组件是否需要同步?

2019-08-26 07:10:18  阅读:275  来源: 互联网

标签:c ipc synchronization boost-interprocess


我正在使用IPC构建一个多生产者/单一消费者应用程序,使用Boost.Interprocess实现.

每个生产者通过在共享内存(managed_shared_memory :: allocate)中分配块并将对象编组到该块中来发送消息.然后,它通过message_queue发送一个小对象,该对象保存块的位置(偏移量)和大小.

消费者从队列中接收该指示符并解组该对象.消费者负责释放内存块.

基于此实现,我不相信内存中存在的对象或块需要同步,因为一旦消费者知道它们,生产者将不再触摸它们.因此,我认为只有message_queue和managed_shared_memory的内部需要同步.

我的问题是:请记住,每个进程都是单线程的,分配/解除分配,发送/接收呼叫需要同步吗?

文档提供的Boost示例不使用消息队列的同步,但我认为这只是为了简化示例源.

我见过this question,但它询问线程安全性,而不是关于Boost.Interprocess的这些特定组件.

解决方法:

您无需使用任何类型的锁定来保护这些操作.它们已在共享内存中使用递归互斥锁进行保护,否则多个进程将无法同时在同一共享内存块中运行.

关于managed_shared_memory

One of the features of named/unique allocations/searches/destructions
is that they are atomic. Named allocations use the recursive
synchronization scheme defined by the internal mutex_family typedef
defined of the memory allocation algorithm template parameter
(MemoryAlgorithm). That is, the mutex type used to synchronize
named/unique allocations is defined by the
MemoryAlgorithm::mutex_family::recursive_mutex_type type. For shared
memory, and memory mapped file based managed segments this recursive
mutex is defined as boost::interprocess::interprocess_recursive_mutex.

这也扩展到原始分配,您可以通过查看boost / interprocess / mem_algo / detail / simple_seq_fit.hpp来验证这一点.

对于消息队列,boost :: interprocess认为这是一个同步机制,其方式与互斥锁相同,它将负责所有必要的保证,锁定其内部数据结构并根据需要发出内存屏障.

此外,这同样适用于多线程编程.即使你在同一个程序中调用send或从多个线程分配,一切都会好的.锁定boost :: interporcess提供的方式可以保护您免受其他线程的侵害,就像它保护您免受其他进程一样.

标签:c,ipc,synchronization,boost-interprocess
来源: https://codeday.me/bug/20190826/1727351.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有