пул потоков std :: async продолжает выполнение без блокировки - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть пул потоков, где каждый поток должен быть ожидающим потоком и постоянно слушать новые задачи для их асинхронной обработки (обработка занимает много времени).Тем не менее, в следующем коде я не могу получить это поведение.Проблема в том, что когда я создаю пул потоков, они успешно выполняют первую заданную задачу.Функция process () достигает значения de return 0;, пока потоки выполняют вычислительные задачи, но никогда не возвращается к main () .Он стоит в строке v.wait(l, [&] {return !tasks.empty(); });, то есть все еще ожидает добавления новых задач в очередь задач, и этого никогда не происходит.Я читал, что это что-то, связанное с деструктором std :: future: Если я не ошибаюсь, я думаю, что когда process () достигает возврата, вызывается деструктор std :: future, и он ждетпока все потоки не заканчиваются, но они никогда не заканчиваются!

Вот код:

static int callings = 0;

class ThreadPool
{

private:
    std::queue<int> tasks;
    std::mutex m;
    std::vector<std::future<void>> finished;
    std::condition_variable v;

public:

    void push_task(int arg) {

        std::unique_lock<std::mutex> l(m);
        tasks.push(arg);
        v.notify_one(); // wake a thread to work on the task
    }

    void read_tasks() {

        while (true) {

            std::unique_lock<std::mutex> l(m);
            if (tasks.empty()) {
                //waits till new task
                v.wait(l, [&] {return !tasks.empty(); }); //after completing the first task, the program stays here forever
            }

            int task = tasks.front(); // read task
            tasks.pop(); //delete task

            //run the task
            std::this_thread::sleep_for(std::chrono::milliseconds(5 * 1000)); //simulate computation

        }//while true
    }

    void create_thread_pool(int m_threads_count) {

        for (int t_i = 0; t_i < m_threads_count; t_i++) {

            finished.push_back(std::async(std::launch::async,[this] { read_tasks(); }));
            printf("Thread %d is doing work...\n", t_i);
        }
    }
}; //ThreadPool


int process(){

    ThreadPool pool;

    if(callings == 0)
    {
        pool.create_thread_pool(4);
    }

    //give some task to do...
    pool.push_task(callings);

    callings++;

    return 0; //point reached but never returning to main
}

int main(){

    while(true){

        // do things...

        process();

        // do more things...
        // this does not execute, how to solve this?

    }

    return 0;
}

Как я могу вернуться к main (), пока потоки продолжают ждать новых задач безблокировка?

Заранее спасибо

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