#include #include #include #include #include #include #include using namespace std; mutex queueMutex; condition_variable queueCondVar; void producer(int id, queue& container) { default_random_engine dre(id); uniform_int_distribution rnd(50, 100); for(int i = 0; i < 5; i++) { { lock_guard lck(queueMutex); container.push(10*id + i); } queueCondVar.notify_one(); this_thread::sleep_for(chrono::milliseconds(rnd(dre))); } } void consumer(stop_token token, int id, queue& container) { default_random_engine dre(id); uniform_int_distribution rnd(50, 100); int value; while(!token.stop_requested()) { { unique_lock lck(queueMutex); queueCondVar.wait(lck, [&] () { return !container.empty(); }); value = container.front(); container.pop(); } cout << "Container #" << id << " has value = " << value << endl; } } int main() { queue data; jthread prod1 {producer, 1, ref(data)}; jthread prod2 {producer, 2, ref(data)}; jthread prod3 {producer, 3, ref(data)}; jthread cons1 {consumer, 4, ref(data)}; jthread cons2 {consumer, 5, ref(data)}; }