]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/lockfree/examples/queue.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / lockfree / examples / queue.cpp
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
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);
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
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 //]