You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							62 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							62 lines
						
					
					
						
							1.4 KiB
						
					
					
				| #include <boost/interprocess/ipc/message_queue.hpp>
 | |
| #include <iostream>
 | |
| #include <vector>
 | |
| #include <thread>
 | |
| #include <chrono>
 | |
| #include <cassert>
 | |
| 
 | |
| #define N 1024
 | |
| #define MSGS 1e5
 | |
| 
 | |
| using namespace boost::interprocess;
 | |
| 
 | |
| message_queue *sub_queue(const char *name){
 | |
|   while (true){
 | |
|     try {
 | |
|       message_queue *mq = new message_queue(open_only, name);
 | |
|       return mq;
 | |
|     }
 | |
|     catch(interprocess_exception &ex){
 | |
|       std::this_thread::sleep_for(std::chrono::milliseconds(10));
 | |
|     }
 | |
| 
 | |
|   }
 | |
| }
 | |
| 
 | |
| message_queue *pub_queue(const char *name){
 | |
|   message_queue::remove(name);
 | |
|   message_queue *mq = new message_queue(create_only, name, 100, N);
 | |
|   return mq;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| int main ()
 | |
| {
 | |
|   message_queue *pq = pub_queue("queue_1");
 | |
|   message_queue *sq = sub_queue("queue_2");
 | |
|   std::cout << "Ready" << std::endl;
 | |
| 
 | |
|   auto start = std::chrono::steady_clock::now();
 | |
|   char * rcv_msg = new char[N];
 | |
|   char * snd_msg = new char[N];
 | |
| 
 | |
|   unsigned int priority;
 | |
|   std::size_t recvd_size;
 | |
| 
 | |
|   for (int i = 0; i < MSGS; i++){
 | |
|     sprintf(snd_msg, "%d", i);
 | |
| 
 | |
|     pq->send(snd_msg, N, 0);
 | |
|     sq->receive(rcv_msg, N, recvd_size, priority);
 | |
|   }
 | |
| 
 | |
|   auto end = std::chrono::steady_clock::now();
 | |
|   double elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count() / 1e9;
 | |
|   double throughput = ((double) MSGS / (double) elapsed);
 | |
| 
 | |
|   std::cout << "Elapsed: " << elapsed << " s" << std::endl;
 | |
|   std::cout << "Throughput: " << throughput << " msg/s" << std::endl;
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 |