【问题标题】:How to use Boost.Interprocess to stream data to other applications?如何使用 Boost.Interprocess 将数据流式传输到其他应用程序?
【发布时间】:2011-04-06 02:01:08
【问题描述】:

main 应用程序需要快速更新共享内存。

而几个consuming 应用程序需要从共享内存中读取数据以更新流数据。

mainconsuming 应用程序是不同的进程

如何使用 Boost.Interprocess 实现这一点?

【问题讨论】:

    标签: c++ boost communication


    【解决方案1】:

    制作人:

    #include <boost/interprocess/managed_shared_memory.hpp>
    #include <boost/interprocess/sync/scoped_lock.hpp>
    #include <boost/interprocess/sync/interprocess_mutex.hpp>
    #include <boost/thread.hpp>
    #include <iostream>
    
    struct shared_data_t {
       boost::uint32_t data;
       boost::interprocess::interprocess_mutex mutex;
    };
    
    /***************************************************************************/
    
    /* producer */
    int main(int argc, char** argv) {
       const char* shname = "_unique_object_name_";
       boost::shared_ptr<const char> remover(
          shname,
          boost::interprocess::shared_memory_object::remove
       );
       try {
          boost::interprocess::shared_memory_object shared_object(
             boost::interprocess::create_only,
             shname,
             boost::interprocess::read_write
          );
          shared_object.truncate(sizeof(shared_data_t));
          boost::interprocess::mapped_region region(
             shared_object,
             boost::interprocess::read_write
          );
          shared_data_t* data = new(region.get_address())shared_data_t;
          assert(data);
          const boost::uint32_t count = 0x1000;
          for ( boost::uint32_t idx = 0; idx < count; ++idx ) {
             {  boost::interprocess::scoped_lock<
                   boost::interprocess::interprocess_mutex
                > lock(data->mutex);
                data->data = idx;
             }
             boost::this_thread::sleep(boost::posix_time::seconds(1));
          }
       } catch(boost::interprocess::interprocess_exception &e){
          std::cout << e.what() << std::endl;
          return 1;
       }
    
       return 0;
    }
    

    消费者:

    #include <boost/interprocess/managed_shared_memory.hpp>
    #include <boost/interprocess/sync/scoped_lock.hpp>
    #include <boost/interprocess/sync/interprocess_mutex.hpp>
    #include <boost/thread.hpp>
    
    struct shared_data_t {
       boost::uint32_t data;
       boost::interprocess::interprocess_mutex mutex;
    };
    
    /***************************************************************************/
    
    /* consumer */
    int main(int argc, char** argv) {
       try {
          boost::interprocess::shared_memory_object shared_object(
             boost::interprocess::open_only,
             "_unique_object_name_",
             boost::interprocess::read_only
          );
          shared_object.truncate(sizeof(shared_data_t));
          boost::interprocess::mapped_region region(
             shared_object,
             boost::interprocess::read_only
          );
          shared_data_t* data = new(region.get_address())shared_data_t;
          assert(data);
          while ( true ) {
             {  boost::interprocess::scoped_lock<
                   boost::interprocess::interprocess_mutex
                > lock(data->mutex);
                std::cout << "ping: " << data->data << std::endl;
             }
             boost::this_thread::sleep(boost::posix_time::milliseconds(100));
          }
       } catch(boost::interprocess::interprocess_exception &e){
          std::cout << e.what() << std::endl;
          return 1;
       }
       return 0;
    }
    

    男人: http://www.boost.org/doc/libs/1_43_0/doc/html/interprocess/synchronization_mechanisms.html

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 1970-01-01
      • 2012-01-20
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 2010-09-07
      • 2011-04-09
      相关资源
      最近更新 更多