Boost::interprocess
プロセス間通信を
WindowsとMacの両方で同じソースで動くようにするために
boost::interprocess を使うことにした.
Shared Memory に関しては
公式のサンプルプログラムを見ればおおよその流れは分かる.
これが一部抜粋したもの
//Remove shared memory on construction and destruction struct shm_remove { shm_remove() { shared_memory_object::remove("MySharedMemory"); } ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); } } remover; //Create a shared memory object. shared_memory_object shm (create_only, "MySharedMemory", read_write); //Set size shm.truncate(1000); //Map the whole shared memory in this process mapped_region region(shm, read_write); //Write all the memory to 1 std::memset(region.get_address(), 1, region.get_size()); //Launch child process std::string s(argv[0]); s += " child "; if(0 != std::system(s.c_str())) return 1;
要は
- 共有メモリオブジェクトを生成
- サイズを決定する
- マップする
- 使う
の4ステップと...
あとは使いおわったら
using boost::interprocess; shared_memory_object::remove("shared_memory");
しましょう!!
ぐらいかな?
どうも
Windows や 一部 UNIX などで
Shared Memory がサポートされてない場合は
/tmp的な場所にてMapped Filesを作ることでエミュレーションしてくれるらしい.
でも
たぶんそうなると...遅くなるんでしょうね〜
よくわかってませんが
ファイルにマップするようになると
どーしても遅くなるという印象があるんで...
つっても
これだけ手軽に使えれば文句なしですが!!
B4の時に
UNIXのシステムコールとにらめっこしながら
プロセス間のメモリ共有をしたときに比べれば...な〜んて簡単♪
Boostさま×2って感じです(^^)
また,なんか分かったり疑問があったら更新します.