Использование std::async в конструкторе

Я новичок в C++11 std::async и я не могу понять, почему код ниже никогда не печатает bar,

Может ли кто-то пролить свет на это для меня?

class Thready {

  public:

    Thready() {
        std::async(std::launch::async, &Thready::foo, this);
    }

    void foo() {
        while (true) {
            std::cout << "foo" << std::endl;
        }
    }

    void bar() {
        while (true) {
            std::cout << "bar" << std::endl;
       }
    }
};

int main() {  
    Thready t;
    t.bar();
}

1 ответ

Решение

См. Раздел "Примечания" на этой странице: http://en.cppreference.com/w/cpp/thread/async

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

std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f()
std::async(std::launch::async, []{ g(); }); // does not start until f() completes

(обратите внимание, что деструкторы std:: futures, полученные не посредством вызова std:: async, никогда не блокируются)

TL; DR:

попытайтесь сохранить возвращаемое значение вызова std:: async в некоторую переменную:

auto handle = std::async(std::launch::async, &Thready::foo, this);

РЕДАКТИРОВАТЬ:

следующий код должен работать так, как вы ожидаете.

#include <future>
#include <iostream>

class Thready {

  public:

    Thready() {
        handle = std::async(std::launch::async, &Thready::foo, this);
    }

    void foo() {
        while (true) {
            std::cout << "foo" << std::endl;
        }
    }

    void bar() {
        while (true) {
            std::cout << "bar" << std::endl;
       }
    }

    std::future<void> handle;
};

int main() {  
    Thready t;
    t.bar();
}
Другие вопросы по тегам