Как использовать std::async с методом void без параметров?

Я предполагаю, что есть что-то очень простое, что мне не хватает в std::async. Я пытаюсь запустить 2 метода void асинхронно, без возвращаемых значений.

#include <future>

class AsyncTestClass {

    public:
        void Initialize()
        {
            std::async(&AsyncTestClass::AsyncMethod1);
            std::async(&AsyncTestClass::AsyncMethod2);
        }

        void AsyncMethod1()
        {
            //time consuming operation
        }

        void AsyncMethod2()
        {
            //time consuming operation
        }
};

Но получаю ошибку при вызове моего AsyncMethod1 или AsyncMethod2 в пределах std:async:

Замена не удалась: type 'typename std:conditional‹sizeof....(ArgTypes) == 0, std::_Invoke_traits_Zero‹void, typename std::decay..... неправильно сформирован с _Fty = void (AsyncTestClass:: *)(), _ArgTypes =

Как правильно использовать std:async с void методами без параметров? Примеры, которые я вижу, кажутся похожими на то, как я их использую, но у меня это не работает.


person Eric Smith    schedule 15.01.2021    source источник


Ответы (1)


AsyncTestClass::AsyncMethod1, будучи нестатической функцией-членом, может быть вызвана только в том случае, если предоставлен экземпляр AsyncTestClass. Вы, вероятно, имели в виду это:

std::async(&AsyncTestClass::AsyncMethod1, this)

Это создает объект std::future, значение которого будет получено путем оценки this->AsyncMethod1().

Кстати, возвращаемое значение std::async должно быть присвоено переменной, иначе вызов будет заблокирован. См. std::async не будет создать новый поток, если возвращаемое значение не сохранено. Если у вас C++20, компилятор уловит это за вас благодаря [[nodiscard]].

person Brian Bi    schedule 15.01.2021
comment
О, очень мило, я не знал, что к асинхронному добавлено [[nodiscard]] из C++20. - person cigien; 15.01.2021
comment
Отлично спасибо. - person Eric Smith; 15.01.2021