boost::interprocess 共享記憶體 shared memory

本篇介紹使用 boost C++ 的 interprocess 模組來做IPC行程通訊,內容包含了 boost::interprocess::managed_shared_memory 的用法。

安裝 boost

還沒安裝 boost 的話請參考 windows 安裝方式 / ubuntu 安裝方式

使用範例

boost-interprocess-shared-memory.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// g++ boost-interprocess-shared-memory.cpp -o a.out -pthread -lrt
#include <iostream>
#include <boost/interprocess/managed_shared_memory.hpp>

using namespace boost::interprocess;

int main(int argc, const char *argv[])
{
// 先刪除
bool ret = shared_memory_object::remove("Boost_shm");
std::cout << std::boolalpha << ret << std::endl;
// 建立 managed shared memory
managed_shared_memory managed_shm(open_or_create, "Boost_shm", 1024);
int *i = managed_shm.construct<int>("Integer")(100);
std::cout << *i << '\n';
// 按名字讀取
std::pair<int *, std::size_t> p = managed_shm.find<int>("Integer");
if (p.first)
std::cout << *p.first << std::endl;

return 0;
}

編譯

linux
在 linux 下用 g++ 編譯需要連結 pthread 與 rt。

1
$ g++ boost-interprocess-shared-memory.cpp -o a.out -pthread -lrt

連結 pthread 是因為 boost 內部實作時使用到了 pthread_mutexattr_init、pthread_mutexattr_setpshared、pthread_mutexattr_settype、pthread_mutexattr_destroy 等函式。
連結 rt 是因為 boost 內部實作時使用到了 shm_open、shm_unlink 等函式。
Boost.Interprocess 不用編譯,它是 header only library,只要將你的 Boost header 的目錄加入編譯器的 include path 即可。
Boost.Interprocess 是依賴於 Boost.DateTime

windows
在 windows 下用 visual studio 編譯不連結 DateTime 的函式庫的話記得加 BOOST_DATE_TIME_NO_LIB,要加在 boost/interprocess/*.hpp 前才有意義。

1
2
#define BOOST_DATE_TIME_NO_LIB
#include <boost/interprocess/managed_shared_memory.hpp>

參考
Chapter 33. Boost.Interprocess - Managed Shared Memory
https://theboostcpplibraries.com/boost.interprocess-managed-shared-memory
boost::interprocess 共享内存 - 作业部落 Cmd Markdown 编辑阅读器
https://www.zybuluo.com/Pigmon/note/1376783


Chapter 17. Boost.Interprocess - 1.66.0
https://www.boost.org/doc/libs/1_66_0/doc/html/interprocess.html
c++ - Is boost::managed_shared_memory using a file on my hard drive? - Stack Overflow
https://stackoverflow.com/questions/58487479/is-boostmanaged-shared-memory-using-a-file-on-my-hard-drive
Highscore - Boost C++ 库 - 进程间通讯
http://zh.highscore.de/cpp/boost/interprocesscommunication.html
Boost IPC共享内存的使用总结 - lday的个人页面 - OSCHINA
https://my.oschina.net/lday/blog/724458
Boost.Interprocess使用手册翻译之二:快速指南 (Quick Guide for the Impatient)_great3779的专栏-CSDN博客
https://blog.csdn.net/great3779/article/details/7222202