#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
int counter = 0;
int maxSize = 30;
std::mutex mtx;
std::queue<int> dataQuene;
std::condition_variable producer, consumer;
void func_consumer()
{
while (true)
{
std::this_thread::sleep_formilliseconds(1000);
std::unique_lock<std::mutex> lck(mtx);
consumer.wait(lck, []
{ return dataQuene.size() != 0; });
int num = dataQuene.front();
dataQuene.pop();
std::cout << "consumer " << std::this_thread::get_id() << ": " << num << std::endl;
producer.notify_all();
}
}
void func_producer()
{
while (true)
{
std::this_thread::sleep_formilliseconds(900);
std::unique_lock<std::mutex> lck(mtx);
producer.wait(lck, []
{ return dataQuene.size() != maxSize; });
++counter;
dataQuene.push(counter);
std::cout << "producer " << std::this_thread::get_id() << ": " << counter << std::endl;
consumer.notify_all();
}
}
int main()
{
std::thread consumers[2], producers[2];
for (int i = 0; i < 2; ++i)
{
consumers[i] = std::thread(func_consumer);
producers[i] = std::thread(func_producer);
}
producers[0].join();
system("pause");
return 0;
}