1 // Copyright (C) 2009 Tim Blechmann 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See 4 // accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 //[queue_example 8 #include <boost/thread/thread.hpp> 9 #include <boost/lockfree/queue.hpp> 10 #include <iostream> 11 12 #include <boost/atomic.hpp> 13 14 boost::atomic_int producer_count(0); 15 boost::atomic_int consumer_count(0); 16 17 boost::lockfree::queue<int> queue(128); 18 19 const int iterations = 10000000; 20 const int producer_thread_count = 4; 21 const int consumer_thread_count = 4; 22 producer(void)23void producer(void) 24 { 25 for (int i = 0; i != iterations; ++i) { 26 int value = ++producer_count; 27 while (!queue.push(value)) 28 ; 29 } 30 } 31 32 boost::atomic<bool> done (false); consumer(void)33void consumer(void) 34 { 35 int value; 36 while (!done) { 37 while (queue.pop(value)) 38 ++consumer_count; 39 } 40 41 while (queue.pop(value)) 42 ++consumer_count; 43 } 44 main(int argc,char * argv[])45int main(int argc, char* argv[]) 46 { 47 using namespace std; 48 cout << "boost::lockfree::queue is "; 49 if (!queue.is_lock_free()) 50 cout << "not "; 51 cout << "lockfree" << endl; 52 53 boost::thread_group producer_threads, consumer_threads; 54 55 for (int i = 0; i != producer_thread_count; ++i) 56 producer_threads.create_thread(producer); 57 58 for (int i = 0; i != consumer_thread_count; ++i) 59 consumer_threads.create_thread(consumer); 60 61 producer_threads.join_all(); 62 done = true; 63 64 consumer_threads.join_all(); 65 66 cout << "produced " << producer_count << " objects." << endl; 67 cout << "consumed " << consumer_count << " objects." << endl; 68 } 69 //] 70