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;
							 | 
						||
| 
								 | 
							
								}
							 |