boost::interprocess

トップページ > 並列/並行処理 >

abstract

必要なヘッダ
<boost/interprocess/*.hpp>
出来ること
プロセス間共有メモリ
リファレンス
en

sample

#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
...

etc

POSIX の共有メモリを強力にラップしたライブラリです。 Windows や MacOS にも対応していますが、 POSIX のセマンティクスに合わせるため一部エミュレーションになっているそうです。

共有メモリやメモリマップドファイルの作成/破棄や、 プロセス間で同期をとるためのプリミティブ(named/anonymous mutex, semaphore, ...)、 共有メモリ上にC++のオブジェクトを構築するための様々な補助ユーティリティ (アロケータや、アドレス空間の違いを吸収するスマートポインタ等々) から成り立つライブラリです。 上記のサンプルで使用した managed_shared_memory はかなり高レベルのAPIで、 もっと下のレイヤでの操作もサポートされています。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0