【问题标题】:c++ boost::interprocess simple applicationc++ boost::interprocess 简单应用
【发布时间】:2010-11-25 15:30:52
【问题描述】:

我想编写一个带有 boost 的简单应用程序,将字符串对象传递给其他进程。它编译得很好,但是当我尝试从第二个进程打印出字符串时,以下消息被放到控制台并且第二个进程崩溃:

../boost_1_44_0/boost/interprocess/sync/posix/interprocess_recursive_mutex.hpp:107: 空白 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

第二个流程代码:

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;

我怎样才能使我的应用程序以正确的方式工作?

【问题讨论】:

    标签: c++ boost interprocess


    【解决方案1】:

    从您的代码中不清楚您是指 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;
    

    注意:所有这些复杂性的原因是this

    干杯

    【讨论】:

    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2019-01-23
    相关资源
    最近更新 更多