Потоки не заканчиваются, а подчиненные не работают (c ++) - PullRequest
0 голосов
/ 05 ноября 2018

Я пишу программу, в которой мастер работает, что-то делает, пробуждает двух рабов и ждет, рабы что-то делают, пробуждают мастера и так далее. Вот код:

#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...
> ----------------------------------------

Так что в принципе у меня две проблемы. Первый - это то, что ведомые не работают одновременно, один запускается и заканчивает работу, затем другой продолжается, и я хочу, чтобы они работали вместе. Вторая проблема, которую я имею, состоит в том, что программа не заканчивается, и я не знаю почему, поскольку я думал, что потоки были убиты когда закончено. Надеюсь, ты сможешь мне помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...