#include #include #include "concurrency/thread.h" using std::cout; using std::endl; using std::queue; using concurrency::condition; using concurrency::mutex; using concurrency::lock_guard; class int_producer { private: queue& q; mutex& m; condition >& not_empty; int i; public: int_producer( queue& init_q, mutex& init_mutex, condition >& init_not_empty ) : q(init_q), not_empty(init_not_empty), m(init_mutex), i(0) { } void operator()() { while (i < 1000) { lock_guard lock(m); q.push(i++); not_empty.notify_one(); } } }; class int_consumer { private: string who; queue& q; mutex& m; condition >& not_empty; public: int_consumer( const string& init_who, queue& init_q, mutex& init_mutex, condition >& init_not_empty ) : who(init_who), q(init_q), not_empty(init_not_empty), m(init_mutex) { } void operator()() { for (;;) { lock_guard lock(m); while (q.empty()) { not_empty.wait(lock); } int value = q.front(); if (value >= 999) { cout << "k thnx bie" << endl; break; } q.pop(); cout << who << " has an int: " << value << " (" << q.size() << ") " << endl; } } }; int main() { condition > not_empty; mutex m; queue q; concurrency::thread t3(int_consumer("i2", q, m, not_empty)); concurrency::thread t2(int_consumer("i", q, m, not_empty)); concurrency::thread t1(int_producer(q, m, not_empty)); t1.join(); t2.join(); t3.join(); return 0; }