#include <iostream>
#include <string>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
using namespace std;
using namespace boost::interprocess;
// 適当なオブジェクト
struct Foo
{
int a, b, c;
Foo(int a, int b, int c) : a(a), b(b), c(c) {}
};
// 適当な名前
static const char* NAME = "MySharedMemory";
// 適当なmain
int main( int argc, char* argv[] )
{
if( argc==2 && std::string(argv[1])=="remove" )
{
// removeと言われたら共有メモリ領域を削除
shared_memory_object::remove( NAME );
}
else
{
// 共有メモリ領域を開く(なければ作る。1024バイト)
managed_shared_memory shm(open_or_create, NAME, 1024);
// 共有メモリ内の名前付きオブジェクトを取得(なければ作る)
interprocess_mutex* mx = shm.find_or_construct<interprocess_mutex>("TheMutex")();
Foo* ptr = shm.find_or_construct<Foo>("TheFoo")( 0, 0, 0 );
scoped_lock<interprocess_mutex> lock(*mx); // プロセス間ロック
ptr->a += 1; // データ更新
ptr->b += 2;
ptr->c -= 3;
cout << ptr->a << " " << ptr->b << " " << ptr->c
<< " " << ptr->a+ptr->b+ptr->c << endl;
// RAII。ここで自動的にロック解除
}
}
> test&test&test&test&test&test&test&test&test&test&test&test&test&test&test&test&test&test 1 2 -3 0 2 4 -6 0 3 6 -9 0 4 8 -12 0 5 10 -15 0 6 12 -18 0 7 14 -21 0 8 16 -24 0 9 18 -27 0 10 20 -30 0 11 22 -33 0 12 24 -36 0 ...
POSIX の共有メモリを強力にラップしたライブラリです。 Windows や MacOS にも対応していますが、 POSIX のセマンティクスに合わせるため一部エミュレーションになっているそうです。
共有メモリやメモリマップドファイルの作成/破棄や、 プロセス間で同期をとるためのプリミティブ(named/anonymous mutex, semaphore, ...)、 共有メモリ上にC++のオブジェクトを構築するための様々な補助ユーティリティ (アロケータや、アドレス空間の違いを吸収するスマートポインタ等々) から成り立つライブラリです。 上記のサンプルで使用した managed_shared_memory はかなり高レベルのAPIで、 もっと下のレイヤでの操作もサポートされています。