Как мне объявить асинхронную функцию? - PullRequest
0 голосов
/ 25 марта 2019

Я новичок в потоках и асинхронных функциях и пытаюсь использовать асинхронную функцию для возврата информации из функции ниже:

std::vector<std::vector<int> > calculatingSlices(SquareMatrix A, std::vector<std::vector<int> > slices)

и я делаю это, используя следующий код:

std::vector<std::vector<int>> slices;
std::vector<std:future<std::vector<int>>> results;
for(int i = 0; i < numOfThreads; i++){
    results.push_back(std::async(std::launch::async, calculatingSlices, A, slices))
}

Я получаю эту ошибку, хотя:

error: attempt to use a deleted function

Итак, я предполагаю, что мой начальный вопрос - как объявить асинхронную функцию?

У меня также есть несколько вопросов о том, как работают асинхронные функции. Если вы объявляете несколько асинхронных функций в цикле, как я делал выше, будут ли они выполняться одновременно? или они будут запускаться по одному, пока он проходит через цикл?

Если они запускаются по одному, что может быть лучше для одновременного запуска этой функции среди различного числа потоков?

1 Ответ

1 голос
/ 25 марта 2019
  1. Пожалуйста, опубликуйте полное сообщение об ошибке. Отправленная вами ошибка не дает никаких намеков на ошибку.

  2. Пожалуйста, отправьте скомпилированный и полностью воспроизводимый MCVE .

  3. Ошибка компиляции gcc довольно ясна:

<source>:14:87: error: no matching function for call to 'std::vector<std::future<std::vector<int> >
>::push_back(std::future<std::vector<std::vector<int> > >)'

         results.push_back(std::async(std::launch::async, calculatingSlices, A, slices))

Поскольку возвращаемое значение calculatingSlices равно vector<vector>, вы хотите сохранить vector<future<vector<vector>>>, а не vector<future<vector>>>. Функция возвращает 2d вектор, а не 1d.

Итак, измените:

std::vector<std:future<std::vector<int>>> results;

в

std::vector<std::future<std::vector<std::vector<int>>>> results;
...