/var/log

技術系のあれこれ。※内容は個人の発言であり、所属する組織を代表するものではありません。

Boost::interprocess

プロセス間通信を
WindowsMacの両方で同じソースで動くようにするために
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って感じです(^^)

また,なんか分かったり疑問があったら更新します.