Параллелизма с запуском std :: async не происходит, выполняется тот же поток - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь использовать функциональность std :: async для параллелизма. Но если я печатаю идентификатор потока, он всегда возвращает одно и то же значение. Кажется, он запускает этот код последовательно. Я что-то пропустил?

Код:

int main()
{
    bool check = false;
    auto func = [&](int i) 
                          { 
                            std::cout<<"  i : "<<i<<"  thread_id : "<<std::this_thread::get_id()<<" ";
                            check = true;
                          }

    for(int j=0;j<10;j++)
    {
        std::async(std::async::launch, func, j);
    }

    std::cout<<" check : "<<check<<" ";

    return 0;
}

Результат:

i : 0  thread_id : 47263726
i : 1  thread_id : 47263726
i : 2  thread_id : 47263726
i : 3  thread_id : 47263726
i : 4  thread_id : 47263726
.
.
.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Согласно примечанию здесь :

Если std :: future, полученный из std :: async, не перемещен или не связан со ссылкой, деструктор std :: future будет блокироваться в конце полного выражения до завершения асинхронной операции, по существу делая код [...] синхронный

Это именно ваш случай. Вам необходимо позаботиться о возвращении async.

#include <vector>
#include <future>
#include <iostream>
#include <chrono>
#include <mutex>

int main()
{
    auto func = [](int i) { 
      std::cout<<"  i : "<<i<<"  thread_id : "<<std::this_thread::get_id()<<"\n";
    };

    using Handle = std::future<void>; // pretty hard to be figured out automatically 
                                      // from lambda, but your function "returns" void
    std::vector<Handle> handles;
    for(int j=0;j<10;j++)
    {
        handles.push_back(std::async(std::launch::async, func, j));
        //result of std::async is implicitly moved onto the vector
    }

    return 0;
}

Выход:

  i : 6  thread_id : 47713265002240
  i : 7  thread_id : 47713267103488
  i : 8  thread_id : 47713269204736
  i : 9  thread_id : 47713271305984
  i : 5  thread_id : 47713262900992
  i : 4  thread_id : 47713260799744
  i : 3  thread_id : 47713258698496
  i : 2  thread_id : 47713256597248
  i : 1  thread_id : 47713254496000
  i : 0  thread_id : 47713252394752
0 голосов
/ 28 августа 2018

std::async возвращает временный объект будущего, который затем немедленно уничтожается. std::future Деструктор разрешено блокировать в этом конкретном случае, ожидая завершения асинхронной операции. Вероятно, это то, что вы наблюдаете - func вызовы выполняются последовательно и просто назначаются одному и тому же рабочему потоку.

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