#include <iostream>
#include <thread>
#include <future>
#include <mutex>
#include <deque>
#include <atomic>
using namespace std;
std::deque<std::packaged_task<int()>>task_q;
std::mutex lock9;
std::atomic<int>finished{0};
int factial_calc2(int in)
{
cout <<"start calc "<<in<<endl;
int ret = 1;
for (int i = in; i > 1; i--)
{
ret = ret*i;
}
//std::lock_guard<std::mutex> locker(lock9);
std::cout << "input is " << in << "result is " << ret << std::endl;
cout <<"end calc "<<in<<endl;
return ret;
}
void test_thread9_producer1()
{
cout <<"start producer1"<<endl;
for (int i = 0; i < 10; i = i + 2)
{
std::lock_guard<std::mutex> locker(lock9);
std::packaged_task<int()> t1(std::bind(factial_calc2, i));
task_q.push_back(std::move(t1));
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
finished++;
cout <<"end producer1"<<endl;
}
void test_thread9_producer2()
{
cout <<"start producer2"<<endl;
for (int i = 1; i < 10; i = i + 2)
{
std::lock_guard<std::mutex> locker(lock9);
std::packaged_task<int()> t1(std::bind(factial_calc2, i));
task_q.push_back(std::move(t1));
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
cout <<"end producer2"<<endl;
finished++;
}
void test_thread9_consumer1()
{
bool nothing_to_do{false};
cout <<"consumer1"<<endl;
while (!nothing_to_do && finished<2)
{
std::packaged_task<int()>t;
{
std::lock_guard<std::mutex> locker(lock9);
cout<< "Loop remaining "<< task_q.size() <<endl;
nothing_to_do=task_q.empty();
if (!nothing_to_do)
{
t = std::move(task_q.front());
task_q.pop_front();
}
}
if (t.valid())
t();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
cout<<"end consumer"<<endl;
}
void test_thread9()
{
std::thread t1(test_thread9_producer1);
std::thread t2(test_thread9_producer2);
std::thread t3(test_thread9_consumer1);
t1.join();
t2.join();
t3.join();
}
int main() {
test_thread9();
return 0;
}