C ++ 17 std :: async неблокирующее выполнение - PullRequest
0 голосов
/ 01 сентября 2018

Я создал этот код C ++ 17, который имитирует то, что мне нужно.

std::cout << "start" << std::endl;

auto a = std::async([]() -> int {
    std::this_thread::sleep_for(std::chrono::seconds{ 5 });
    return 2;
});
std::cout << a.get() << std::endl;

std::cout << "stop" << std::endl;

Поток спит здесь, но в реальном примере я выполняю тяжелые операции и возвращаю целое число, которое может быть 0, 1 или 7. Это мой вывод:

start
2
stop

Это хорошо! Этот код не замораживает мой пользовательский интерфейс. Я знаю, что a.get() является блокирующей операцией, но есть ли способ не блокировать?

Другими словами: вместо

start
2
stop

можно получить как вывод

start
stop
2

с использованием async? Мне нужна асинхронность, потому что я нашел в сети, что это полезно, когда необходимо вернуть значение. Это также легко читать! Я не хочу использовать std::packaged_task, обещания, фьючерсы и т. Д., Потому что async легко.

Если это не может быть неблокирующим, могу ли я использовать что-то еще?

1 Ответ

0 голосов
/ 01 сентября 2018

Этот код выведет то, что вам нужно:

std::cout << "start" << std::endl;

std::thread{
    []() {
        auto a = std::async([]() -> int {
            std::this_thread::sleep_for(std::chrono::seconds{ 5 });
            return 2;
        });

        std::cout << a.get() << std::endl;
    }
}.detach();

std::cout << "stop" << std::endl;

На вашем месте я бы вообще не использовал async. Если вам просто нужно отобразить значение, и вы не хотите блокировать, вы должны сделать что-то еще. Например:

std::cout << "start" << std::endl;

std::thread{
    []() {
        //do here what you need and print the result
    }
}.detach();

/* ... or ...
auto t = std::thread{ ... };
t.detach();
*/

std::cout << "stop" << std::endl;

Обратите внимание, что detach() делает новый поток "независимым" и не блокируется, пока join() блокируется. Дело в том, что async должен блокировать, потому что, если он должен выполнить операцию, которая занимает много времени, он должен потратить это время!

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