当前位置: 首页 > news >正文

002-Boost共享内存的使用

Boost共享内存

以下是Boost共享内存的详细使用指南,包含完整C++代码和分步解析,涵盖基础操作和高级应用场景:

一、Boost共享内存核心组件

  • shared_memory_object
    用于创建/打开共享内存对象,需指定名称和访问模式。
#include <boost/interprocess/shared_memory_object.hpp> 
using namespace boost::interprocess;

shared_memory_object shm(
    open_or_create,    // 模式:存在则打开,否则创建 
    "MySharedMemory",  // 唯一标识名称 
    read_write         // 访问权限(read_only / read_write)
);
  • mapped_region
    将共享内存映射到进程地址空间,支持读写操作。
#include <boost/interprocess/mapped_region.hpp> 
mapped_region region(
    shm,               // 共享内存对象 
    read_write,        // 映射权限 
    0,                 // 偏移量(默认0)
    1024               // 映射大小(默认全部)
);

二、基础使用代码示例

  • 写入进程
#include <iostream>
#include <boost/interprocess/shared_memory_object.hpp> 
#include <boost/interprocess/mapped_region.hpp> 
 
int main() {
    // 1. 创建或打开共享内存 
    shared_memory_object shm(
        open_or_create, 
        "MySharedMemory", 
        read_write 
    );
    
    // 2. 设置内存大小(必须拥有写权限)
    shm.truncate(1024);   // 分配1024字节 
    
    // 3. 映射到当前进程 
    mapped_region region(shm, read_write);
    
    // 4. 写入数据 
    char* data = static_cast<char*>(region.get_address()); 
    std::strcpy(data, "Hello from Process A!");
    
    std::cout << "Data written to shared memory." << std::endl;
    // 注意:实际应用中需同步机制(如互斥锁)
    return 0;
}
  • 读取进程
int main() {
    // 1. 打开已有共享内存 
    shared_memory_object shm(open_only, "MySharedMemory", read_only);
    
    // 2. 映射内存 
    mapped_region region(shm, read_only);
    
    // 3. 读取数据 
    char* data = static_cast<char*>(region.get_address()); 
    std::cout << "Received: " << data << std::endl;
    
    // 4. 清理(通常由最后一个进程执行)
    shared_memory_object::remove("MySharedMemory");
    return 0;
}

三、高级应用:共享内存中使用STL容器

  • 使用托管内存和自定义分配器
#include <boost/interprocess/managed_shared_memory.hpp> 
#include <boost/interprocess/containers/vector.hpp> 
#include <boost/interprocess/allocators/allocator.hpp> 
 
typedef int ValueType;
typedef allocator<ValueType, managed_shared_memory::segment_manager> ShmemAllocator;
typedef vector<ValueType, ShmemAllocator> SharedVector;
 
int main() {
    // 创建托管共享内存(自动管理生命周期)
    managed_shared_memory segment(open_or_create, "ManagedSHM", 65536);
    
    // 构造共享vector 
    SharedVector* vec = segment.find_or_construct<SharedVector>("MyVector") 
        (segment.get_allocator<ValueType>()); 
    
    // 添加数据 
    vec->push_back(42);
    vec->push_back(88);
    
    // 其他进程可通过相同名称访问该vector 
    return 0;
}

四、同步机制(互斥锁示例)

#include <boost/interprocess/sync/interprocess_mutex.hpp> 
 
struct SharedData {
    interprocess_mutex mutex;
    int counter = 0;
};
 
// 写入进程 
managed_shared_memory segment(open_or_create, "SyncSHM", 4096);
SharedData* data = segment.find_or_construct<SharedData>("Data")(); 
 
{
    scoped_lock<interprocess_mutex> lock(data->mutex); // 自动加锁 
    data->counter++;
}

// 读取进程同理,通过互斥锁保证原子操作 

五、关键注意事项

  • 生命周期管理
  • 使用shared_memory_object::remove()显式删除共享内存。
  • 托管内存(managed_shared_memory)自动管理对象构造/析构。
  • 避免直接存储指针,使用offset_ptr处理地址偏移。
  • 预分配足够内存避免频繁调整。
  • 减少锁粒度提升并发性能。

通过上述方法,可实现跨进程高效数据交换,适用于高频通信场景如实时数据处理。

完整代码

Github

作者郑天佐
邮箱zhengtianzuo06@163.com
主页http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

相关文章:

  • C语言-函数指针与指针函数的区别
  • ChatGPT结合DeepSeek新式文献获取+文献拆解流程分享!学术论文轻松上岸!
  • SCI1区TOP:自适应学习粒子群算法SLPSO,深度解析+性能实测
  • 【孟德尔随机化】PhenoScanner不能用的,替代方法
  • PPT 技能:巧用 “节” 功能,让演示文稿更有序
  • 使用 Arduino 的 WiFi 控制机器人
  • 【人工智能】【Python】在Scikit-Learn中使用KNN(K最近邻算法)
  • Ruoyi+uniapp+websocket点对点和广播通知消息
  • 分享几个论文校对相关的deepseek提示词
  • Linux脚本编程
  • python基础课程整理--字典的基础
  • 图像滑块对比功能的开发记录
  • 芋道打包时报错:缺失@unocss插件
  • WLAN无线组网 WI-FI
  • 使用 Python pandas操作 Excel 文件
  • leetcode0020 - 有效的括号 easy
  • 精选一百道备赛蓝桥杯——2.K倍区间
  • YOLOv10改进之MHAF(多分支辅助特征金字塔)
  • BookChatApp通用书籍阅读APP
  • 云渲染技术在影视特效制作中的核心优势
  • 宁德时代在港上市,创香港近年最大IPO
  • 2025年新季夏粮收购量将达到2000亿斤左右
  • MiniMax发布新一代语音大模型
  • 证监会副主席李明:支持符合条件的外资机构申请新业务、设立新产品
  • 全中国最好的十个博物馆展陈选出来了!
  • 天算星座二期首批卫星成功发射,将助力6G空天信息基础设施建设