Я пишу программу, в которой мастер работает, что-то делает, пробуждает двух рабов и ждет, рабы что-то делают, пробуждают мастера и так далее. Вот код:
#include <stdio.h>
#include <iostream>
#include <cstdio>
#include <mutex>
#include <chrono>
#include <condition_variable>
#include <thread>
using namespace std;
bool blue_slave_go=false, yellow_slave_go=false, done=false;
void master_execution(mutex & master_mtx, condition_variable & master_convar, condition_variable & slaves_convar){
unique_lock<mutex> lock(master_mtx);
int counter=0;
std::cout<<"Master thread initialized"<<std::endl;
while (counter<2){
std::cout<<"----------------------------------------"<<std::endl;
std::cout<<"Master thread starting task..."<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
yellow_slave_go = true;
blue_slave_go = true;
slaves_convar.notify_all();
master_convar.wait(lock);
std::cout<<"Master thread awaken..."<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
++counter;
std::cout<<"Master finishing task..."<<std::endl;
std::cout<<"----------------------------------------"<<std::endl;
}
}
void yellow_slave_execution(mutex & slaves_mutex, condition_variable & slaves_convar, condition_variable & master_convar){
unique_lock<mutex> lock(slaves_mutex);
std::cout<<"Creating thread..."<<std::endl;
while(1){
if(!blue_slave_go){
std::cout<<"Waking up master..."<<std::endl;
master_convar.notify_one();
}
slaves_convar.wait(lock);
std::cout<<"Yellow thread starting task..."<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
yellow_slave_go=false;
std::cout<<"Yellow thread finishing task..."<<std::endl;
}
}
void blue_slave_execution(mutex & slaves_mutex, condition_variable & slaves_convar, condition_variable & master_convar){
unique_lock<mutex> lock(slaves_mutex);
std::cout<<"Creating thread..."<<std::endl;
while(1){
if(!yellow_slave_go){
std::cout<<"Waking up master..."<<std::endl;
master_convar.notify_one();
}
slaves_convar.wait(lock);
std::cout<<"Blue thread starting task..."<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
blue_slave_go=false;
std::cout<<"Blue thread finishing task..."<<std::endl;
}
}
int main(){
mutex master_mtx, slaves_mutex;
condition_variable master_convar, slaves_convar;
thread master{master_execution, ref(master_mtx),ref(master_convar), ref(slaves_convar)};
thread blue_slave{blue_slave_execution, ref(slaves_mutex),ref(slaves_convar), ref(master_convar)};
thread yellow_slave{yellow_slave_execution, ref(slaves_mutex),ref(slaves_convar), ref(master_convar)};
blue_slave.join();
yellow_slave.join();
master.join();
blue_slave.detach();
yellow_slave.detach();
master.detach();
std::cout<<"EXECUTION DONE!!!"<<std::endl;
return 0;
}
Я получаю следующий вывод:
> Creating thread...
> Waking up master...
> Creating thread...
> Waking up master...
> Master thread initialized
> ----------------------------------------
> Master thread starting task...
> Yellow thread starting task...
> Yellow thread finishing task...
> Blue thread starting task...
> Blue thread finishing task...
> Waking up master...
> Master thread awaken...
> Master finishing task...
> ----------------------------------------
> ----------------------------------------
> Master thread starting task...
> Yellow thread starting task...
> Yellow thread finishing task...
> Blue thread starting task...
> Blue thread finishing task...
> Waking up master...
> Master thread awaken...
> Master finishing task...
> ----------------------------------------
Так что в принципе у меня две проблемы. Первый - это то, что ведомые не работают одновременно, один запускается и заканчивает работу, затем другой продолжается, и я хочу, чтобы они работали вместе.
Вторая проблема, которую я имею, состоит в том, что программа не заканчивается, и я не знаю почему, поскольку я думал, что потоки были убиты когда закончено.
Надеюсь, ты сможешь мне помочь.