5

文字列オブジェクトを他のプロセスに渡す単純なアプリケーションをブーストで作成したいと考えています。コンパイルはうまくいきますが、2 番目のプロセスから文字列を出力しようとすると、次のメッセージがコンソールに表示され、2 番目のプロセスがクラッシュします。

../boost_1_44_0/boost/interprocess/sync/posix/interprocess_recursive_mutex.hpp:107: void boost::interprocess::interprocess_recursive_mutex::unlock(): アサーション `res == 0' が失敗しました。

最初のプロセス コード:

shared_memory_object::remove(SHARED_MEMORY_NAME);
managed_shared_memory mshm(create_only, SHARED_MEMORY_NAME,  SHARED_MEMORY_SIZE ); 
mshm.construct<string>( IP_STRING_NAME )("Message to other process");
string syscall(argv[0]);
std::system( (syscall+" &").c_str()  ); //starting second process

2 番目のプロセス コード:

managed_shared_memory mshm( open_or_create, SHARED_MEMORY_NAME, SHARED_MEMORY_SIZE  );
std::pair<string * , size_t > p= mshm.find<string>(IP_STRING_NAME);
cout<<"string is "<<*p.first<<endl;

アプリケーションを適切に動作させるにはどうすればよいですか?

4

1 に答える 1

8

あなたのコードからは、boost::interprocess::string と std::string のどちらを意味するかは明らかではありませんが、私の数時間の boost::interprocess (かなりイライラする...) の経験から、どちらも必要ありません...

だから、ここに

boost::interprocess の文字列のクイック ガイド

まず、特別な文字列を定義する必要があります。

typedef boost::interprocess::allocator<char, boost::interprocess::managed_shared_memory::segment_manager> CharAllocator; 
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> my_string;

次に、送信アプリは次を使用する必要があります。

// (mshm is the managed_shared_memory instance from the question)
mshm.construct<my_string>( SOME_STRINGY_NAME )(
            "Message to other process",
            mshm.get_segment_manager());

最後に、読書アプリは次のことを行う必要があります。

std::pair<my_string * , size_t > p= mshm.find<my_string>(SOME_STRINGY_NAME);
cout<< "got " << p.second << " strings " << endl;
cout<< "first string is->"<<p.first->c_str()<<endl;

注: この複雑さの理由はこれにあります。

乾杯

于 2010-12-27T18:15:26.467 に答える