结合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开源了