• BOOST库 消息队列 紧急注意事项 what(): boost::interprocess_exception::library_error


    直接贴实验代码:

    /*******         boost 消息队列          **********/
    #if 1  
    #include <boost/thread/thread.hpp>
    #include <boost/interprocess/ipc/message_queue.hpp>   
    #include <iostream>   
    #include <vector>   
    #include <unistd.h>
    
    using namespace boost::interprocess;  
      
    
    
    void thread_send() 
    { 
       try{  
          //Erase previous message queue   
          message_queue::remove("message_queue");  
      
          //Create a message_queue.   
          message_queue mq  
             (create_only               //only create   
             ,"message_queue"           //name   
             ,10                       //max message number   
             ,sizeof(int)               //max message size   
             );  
      
          //Send 10 numbers   
          for(int i = 0; i < 10; ++i){  
             mq.send(&i, sizeof(i), 0);  
          }  
       }  
       catch(interprocess_exception &ex){  
          std::cout << ex.what() << std::endl;  
          return;  
       } 
    
       return;   
    } 
    
    
    void thread_recv() 
    { 
       try{  
          //Open a message queue.   
          message_queue mq  
             (open_only        //only create   
             ,"message_queue"  //name   
             );  
      
          unsigned int priority;  
          message_queue::size_type recvd_size;  
      
          //Receive 10 numbers   
          for(int i = 0; i < 10; ++i){  
             int number_recv;  
    
             mq.receive(&number_recv, sizeof(int), recvd_size, priority); 
             if(number_recv != i || recvd_size != sizeof(int))  
                return;  
             else
               std::cout << "recv data : " <<  number_recv << std::endl;
          }  
       }  
       catch(interprocess_exception &ex){  
          message_queue::remove("message_queue");  
          std::cout << ex.what() << std::endl;  
          return;  
       }  
       message_queue::remove("message_queue");  
       return;  
    }
    
    
    int main() 
    { 
       boost::thread t_send(thread_send); 
       boost::thread t_recv(thread_recv); 
    
       t_send.detach(); 
       t_recv.detach(); 
    
      while(1){
    
         sleep(3);
         std::cout << " --run--"<< std::endl;  
    
      }
    
      return 0;
    }

    makefile:

    .PHONY: DOIT
    
    DOIT:
        mips-linux-gnu-g++ -I.  my_boost_test.cpp -L./lib  -lboost_thread -lboost_system -o boost_app  -lrt -lpthread

    后记,BOOST库消息队列使用的注意事项

    下面的代码片段会有问题

    片段1:

          //Create a message_queue.   
          message_queue mq1  
            (create_only,       //only create   
             mq_event.c_str() ,         //name   
             2,                        //max message number   
             2*sizeof(int)       max message size   这里是2倍的sizeof(int)
             ); 
    
         p_mq_event =  new  message_queue       //Open a message queue.    
                            (open_only,
                            mq_event.c_str()     //name   
                            ); 

    片段2:

            unsigned int priority;  
            message_queue::size_type recvd_size;  
            int event_t_recv;  
            p_mq_event->receive(&event_t_recv, sizeof(int), recvd_size, priority);  这里第二个参数是sizeof(int) 
            if(recvd_size != len*sizeof(int)) {
                std::cout << "wait_event(): false " << std::endl;
                assert(0);
                return false;  
    
            }else{
                r_event_t = event_t_recv;
                std::cout << "wait_event(): event_t = " << event_t_recv << std::endl;
                return true;  
            }

    运行效果:

    BOOST库使用消息队列的容易出错的点:

    max message size 值需要和调用receive 或 send方法时的第二个参数大小一样。否则就会报上述错误。

    .

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    sql2005 如何重启数据库服务
    jQuery 树控件 zTree
    谈C#中的Delegate
    微博首席架构师杨卫华:新浪微博技术架构分析(转)
    jqGrid 各种参数 详解
    asp.net(c#)ref,out ,params的区别
    gcc
    数据结构递归
    跳表
    javajvm
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/13837594.html
Copyright © 2020-2023  润新知