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.
		
		
		
		
			
				
					63 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					63 lines
				
				1.4 KiB
			| 
											6 years ago
										 | #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;
 | ||
|  | }
 |