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

Boost.Interprocess 介绍与使用

文章目录

  • Boost.Interprocess 介绍与使用
    • 主要特性
    • 基本使用示例
      • 1. 简单的共享内存示例
      • 2. 在进程间共享C++类
        • 示例:共享一个简单的类
      • 3. 使用偏移指针共享复杂类
    • 注意事项
    • 高级特性

Boost.Interprocess 介绍与使用

Boost.Interprocess 是 Boost 库中的一个组件,它提供了在进程间共享内存、文件和同步原语的工具,使得多个进程可以高效地共享数据。

主要特性

  1. 共享内存:在进程间创建共享内存区域
  2. 内存映射文件:将文件映射到内存
  3. 同步机制:提供互斥量、条件变量等同步原语
  4. 内存分配:在共享内存中进行动态内存分配
  5. 容器:提供可在共享内存中使用的STL-like容器

基本使用示例

1. 简单的共享内存示例

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>using namespace boost::interprocess;int main(int argc, char *argv[])
{if(argc == 1){ // 父进程// 删除之前可能存在的共享内存shared_memory_object::remove("MySharedMemory");// 创建新的共享内存shared_memory_object shm(create_only, "MySharedMemory", read_write);// 设置大小shm.truncate(1000);// 映射到当前进程地址空间mapped_region region(shm, read_write);// 写入数据std::memset(region.get_address(), 1, region.get_size());// 启动子进程std::string s(argv[0]); s += " child";if(0 != std::system(s.c_str()))return 1;}else{ // 子进程// 打开已有的共享内存shared_memory_object shm(open_only, "MySharedMemory", read_only);// 映射到当前进程地址空间mapped_region region(shm, read_only);// 检查数据char *mem = static_cast<char*>(region.get_address());for(std::size_t i = 0; i < region.get_size(); ++i)if(*mem++ != 1)return 1; // 错误}shared_memory_object::remove("MySharedMemory");return 0;
}

2. 在进程间共享C++类

要在进程间共享C++类,需要注意以下几点:

  1. 类必须完全包含在共享内存中
  2. 不能使用虚函数(或需要特殊处理)
  3. 指针必须转换为偏移指针才能在共享内存中使用
示例:共享一个简单的类
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <iostream>using namespace boost::interprocess;// 定义一个在共享内存中使用的类
class SharedData {
public:int value;double data;void print() const {std::cout << "Value: " << value << ", Data: " << data << std::endl;}
};typedef allocator<SharedData, managed_shared_memory::segment_manager> ShmemAllocator;
typedef vector<SharedData, ShmemAllocator> SharedVector;int main(int argc, char *argv[])
{if(argc == 1){ // 父进程// 删除之前可能存在的共享内存shared_memory_object::remove("MySharedMemory");// 创建托管共享内存managed_shared_memory segment(create_only, "MySharedMemory", 65536);// 在共享内存中构造一个SharedData对象SharedData *data = segment.construct<SharedData>("SharedDataObject")();data->value = 42;data->data = 3.14;// 在共享内存中创建vectorconst ShmemAllocator alloc_inst(segment.get_segment_manager());SharedVector *vec = segment.construct<SharedVector>("SharedVector")(alloc_inst);// 添加一些数据for(int i = 0; i < 5; ++i) {SharedData d;d.value = i;d.data = i * 1.1;vec->push_back(d);}// 启动子进程std::string s(argv[0]); s += " child";if(0 != std::system(s.c_str()))return 1;// 清理segment.destroy<SharedData>("SharedDataObject");segment.destroy<SharedVector>("SharedVector");}else{ // 子进程// 打开托管共享内存managed_shared_memory segment(open_only, "MySharedMemory");// 查找SharedData对象std::pair<SharedData*, std::size_t> ret = segment.find<SharedData>("SharedDataObject");if(ret.first) {ret.first->print();}// 查找vectorstd::pair<SharedVector*, std::size_t> vec_ret = segment.find<SharedVector>("SharedVector");if(vec_ret.first) {std::cout << "Vector contents:" << std::endl;for(const auto& item : *vec_ret.first) {item.print();}}}shared_memory_object::remove("MySharedMemory");return 0;
}

3. 使用偏移指针共享复杂类

对于包含指针的类,需要使用boost::interprocess::offset_ptr

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/offset_ptr.hpp>using namespace boost::interprocess;class Node {
public:int value;offset_ptr<Node> next;  // 使用offset_ptr代替原始指针Node() : value(0), next(nullptr) {}
};int main()
{shared_memory_object::remove("SharedMemory");{managed_shared_memory segment(create_only, "SharedMemory", 65536);// 创建两个节点并链接它们Node* node1 = segment.construct<Node>("Node1")();Node* node2 = segment.construct<Node>("Node2")();node1->value = 1;node2->value = 2;node1->next = node2;  // 安全地在共享内存中设置指针// 子进程可以访问这个链表结构}shared_memory_object::remove("SharedMemory");return 0;
}

注意事项

  1. 同步:访问共享数据时需要适当的同步机制(互斥量、条件变量等)
  2. 内存布局:不同进程中的类必须具有完全相同的内存布局
  3. 析构:共享内存中的对象不会自动析构,需要手动管理
  4. 兼容性:共享数据的进程必须使用相同编译器、相同编译选项编译

高级特性

  1. 共享内存中的STL容器:Boost.Interprocess提供了可在共享内存中使用的容器版本
  2. 内存池:高效的共享内存分配器
  3. 文件映射:将文件映射到内存并在进程间共享
  4. 消息队列:进程间通信的消息队列

Boost.Interprocess是一个强大的库,可以用于构建复杂的进程间通信系统,但需要谨慎处理同步和内存管理问题。

http://www.xdnf.cn/news/13563.html

相关文章:

  • 2025年高考志愿填报指导资料
  • shap可解释恶意流量检测
  • Zab协议剖析:崩溃恢复与顺序原子广播
  • JS手写代码篇---手写深拷贝
  • 万字深度解析注意力机制全景:掌握Transformer核心驱动力​
  • PHP性能提升方案
  • Redis的主从复制底层实现
  • 数组方法_push()/pop()/数组方法_shift()/unshift()
  • Springboot中 MyBatis-Flex TableDef 的使用
  • 常见的CAN总线协议面试题
  • 一套基于Apple watch电话手表包含150个覆盖商务、健康、爱好、定位、时钟、挂件的移动端UI界面的psd
  • 多项式求和
  • 复合材料成型工艺
  • 孙宇晨Token 2049高峰对话,技术话题与社会议题相结合
  • SHA-1算法详解:原理、特点与应用
  • ( github actions + workflow 01 ) 实现爬虫自动化,每2小时爬取一次澎湃新闻
  • Yakit 热加载入门学习指南
  • 深入理解 PCIe 协议中 BDF(Bus/Device/Function)分配与管理机制
  • (九)现代循环神经网络(RNN):从注意力增强到神经架构搜索的深度学习演进
  • 广东省省考备考(第二十六天6.11)—言语:语句表达(练习)
  • leetcode_283.移动零
  • 品牌控价需要精准SKU 数据监测
  • 【 WWDC25:新系统,新命名】
  • 五款MySQL 可视化客户端软件
  • 相机--单目相机
  • 《tqdm:让你的代码会“喘气”的神奇进度条!》
  • 性能测试Locust的使用
  • Docker pull时报错:https://registry-1.docker.io/v2/
  • FastAPI基础入门(三)
  • 创客匠人赋能家庭教育行业:从知识分享到IP变现的转型之路