Boost(八)——进程间通讯

结合Boost官网

使用的是boost::interprocess库。

共享内存通常是进程间通讯最快的形式。

boost::interprocess::shared_memory_object

托管共享内存

boost::interprocess::managed_shared_memory

设置内部数据采用 construct<template T>("name")(num);

name:名字作为识别标签设计。是为了find方法。

num:设置的数据值

find 方法的返回值是pair类型,

std::pair<int *, size_t> p = managed_shd.find<int>("name");

int * 是地址, size_t 是对象数,

举个简单的例子区分,上面的 construct是创建了单个对象,同样加上[ ]构建数组,如construct<template T>("name")[ ](num);

 

如果创建的不是基本类型(int, char等等)呢?

Boost.Interprocess 在 boost/interprocess/allocators/allocator.hpp 文件中提供了boost::interprocess::allocator 类的定义。

typedef boost::interprocess::allocator<char, boost::interprocess::managed_shared_memory::segment_manager> CharAllocator;

typedef boost::interprocess::basic_string<char, char_traits<char>, CharAllocator> String;

 ①CharAllocator的构造形式

//!An STL compatible allocator that uses a segment manager as
//!memory source. The internal pointer type will of the same type (raw, smart) as
//!"typename SegmentManager::void_pointer" type. This allows
//!placing the allocator in shared memory, memory mapped-files, etc...
template<class T, class SegmentManager>
class allocator

String的构造形式

charT:数据存储类型

Traits:traits(charT)

Allocator:内存分配方式:①CharAllocator

//! \tparam CharT The type of character it contains.
//! \tparam Traits The Character Traits type, which encapsulates basic character operations
//! \tparam Allocator The allocator, used for internal memory management.
#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
template <class CharT, class Traits = std::char_traits<CharT>, class Allocator = new_allocator<CharT> >
#else
template <class CharT, class Traits, class Allocator>
#endif
class basic_string

其实也不用上面这么麻烦,我试验了下也可以直接用string类,demo如下:

boost::interprocess::managed_shared_memory managed_shd(boost::interprocess::open_or_create, "HighScore", 1024);
string *s = managed_shd.find_or_construct<string>("String")(string("Hello"));
atomic_func(Func &f):接受无返回值类型的函数

如:

boost::interprocess::managed_shared_memory managed_shd(...);
managed_shd.atomic_func(boost::bind(F, boost::ref(managed_shd));

boost::ref在第三章函数对象有说明:起到引用调用参数的作用。

进程间同步

在修改共享内存存储的数据时,需要加上进程锁。

互斥锁:boost::interprocess::named_mutex。

条件变量:boost::interprocess::named_condition。

 

练习题:

1、创建一个通过共享内存通讯的客户端/服务器应用程序。 文件名称应该作为命令行参数传递给客户端应用程序。 这个文件存储在服务器端应用程序启动的目录下,这个文件应经由共享内存发送给服务器端应用程序。

 

解答在github开源了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值