Advertisement
Guest User

ConcurrentQueueUHD

a guest
Apr 30th, 2015
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <queue>
  2. #include <mutex>
  3. #include <thread>
  4. #include <iostream>
  5. #include <complex>
  6. #include <condition_variable>
  7.  
  8. typedef std::vector< std::complex<double> > complex_double_vector;
  9.  
  10. class concurrent_queue
  11. {
  12. private:
  13.     std::queue<complex_double_vector *> the_queue;
  14.     mutable std::mutex the_mutex;
  15.     std::condition_variable the_condition_variable;
  16. public:
  17.     void push(complex_double_vector *data)
  18.     {
  19.         std::unique_lock<std::mutex> lock(the_mutex);
  20.         the_queue.push(data);
  21.         lock.unlock();
  22.         the_condition_variable.notify_one();
  23.     }
  24.  
  25.     bool empty() const
  26.     {
  27.         std::unique_lock<std::mutex> lock(the_mutex);
  28.         return the_queue.empty();
  29.     }
  30.  
  31.     bool try_pop()
  32.     {
  33.         std::unique_lock<std::mutex> lock(the_mutex);
  34.         if(the_queue.empty())
  35.         {
  36.             return false;
  37.         }
  38.         return true;
  39.     }
  40.     complex_double_vector* return_pop()
  41.     {
  42.         std::unique_lock<std::mutex> lock(the_mutex);
  43.         complex_double_vector* temp_ptr;
  44.         temp_ptr = the_queue.front();
  45.         the_queue.pop();
  46.         return temp_ptr;
  47.     }
  48.  
  49.     void wait_for_pop()
  50.     {
  51.         std::unique_lock<std::mutex> lock(the_mutex);
  52.         while(the_queue.empty())
  53.         {
  54.             the_condition_variable.wait(lock);
  55.         }
  56.     }
  57.  
  58. };
  59. concurrent_queue myqueue;
  60.  
  61.  
  62. //std::mutex print_mutex;
  63. void Producer()
  64. {
  65.     bool toggler;
  66.     while(true)
  67.     {
  68.         complex_double_vector *ptr = new complex_double_vector(100);
  69.         complex_double_vector& r = *ptr;
  70.         if(toggler)
  71.         {
  72.             for(int i=0;i<100;i++)
  73.                 r[i] = std::complex<double>(1,2);
  74.         }
  75.         else
  76.         {
  77.             for(int i=0;i<100;i++)
  78.                 r[i] = std::complex<double>(10,20);
  79.         }
  80.         toggler = !toggler;
  81.         myqueue.push(ptr);
  82.         std::this_thread::sleep_for(std::chrono::seconds(1));
  83.     }
  84. }
  85.  
  86.  
  87. void Consumer()
  88. {
  89.     complex_double_vector* ptr;
  90.     complex_double_vector new_vector;
  91.  
  92.     myqueue.wait_for_pop(); //conditional_variable_for empty check and change state till queue is empty
  93.     while(true)
  94.     {
  95.         if(myqueue.try_pop())
  96.         {
  97.             ptr = myqueue.return_pop();
  98.             complex_double_vector &r = *ptr;
  99.             typename complex_double_vector::const_iterator first = r.begin();
  100.             typename complex_double_vector::const_iterator last = first + 10;
  101.             complex_double_vector newvector = complex_double_vector(first,last);
  102.             std::this_thread::sleep_for(std::chrono::seconds(1));
  103.             {
  104.                 for(int i=0;i<10;i++)
  105.                     std::cout << newvector[i] << " ";
  106.                 std::cout << std::endl;
  107.             }
  108.             delete[]
  109.         }
  110.         if(myqueue.empty())
  111.         {
  112.             std::cout << "There is not data is queue so the thread is exiting" << std::endl;
  113.             exit(0);
  114.         }
  115.     }
  116.  
  117. }
  118.  
  119.  
  120. int main()
  121. {
  122.     std::thread t1(Producer);
  123.     std::thread t2(Consumer);
  124.  
  125.     t1.join();
  126.     t2.join();
  127.  
  128.     return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement