天天看点

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库 消息队列 紧急注意事项 what(): boost::interprocess_exception::library_error

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

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

.

/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/

继续阅读