• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)23 void 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)33 void 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[])45 int 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