std :: async和std :: shared_future导致程序崩溃

时间:2017-10-24 15:07:24

标签: c++ asynchronous stl future void

我试图以异步方式运行某些功能。为此我编写了一个名为Core的类,我使用std::async在不同的线程和std::shared_future<int>中运行函数来等待这个线程,并可能获得未来的结果。这是测试程序的代码:

#include <iostream>
#include <future>

class Core : public std::enable_shared_from_this<Core>
{
public:
    Core()
        : isRunning_(false) {
    };
    ~Core() {
        isRunning_ = false;
        if (f_.valid())
        {
            f_.wait();
            std::cout << "Result is: " << f_.get() << std::endl;
        }
    };
    void Start() {
        isRunning_ = true;
        auto self(shared_from_this());
        f_ = std::async(std::launch::async, [self, this]() {
            try {
                while (true) {
                    if (!isRunning_)
                        break;

                    std::cout << "Boom" << std::endl; // Error occurs here
                    std::this_thread::sleep_for(std::chrono::seconds(1));
                }
            }
            catch (const std::exception& e) {
                std::cerr << "Loop error:" << e.what();
            }
            return 999;
        });
    }

private:
    std::shared_future<int> f_;
    std::atomic<bool> isRunning_;
};

int main()
{
    try {
        std::shared_ptr<Core> load(new Core);
        load->Start();

        throw std::runtime_error("Generate error"); // Added in order to generate error
    }
    catch (const std::exception& e) {
        std::cout << "Error occurred: " << e.what();
    }

    return 0;
}

每次启动此程序时,它都会在此行崩溃:

std::cout << "Boom" << std::endl; // Error occurs here

出现此错误:

Error output

这是我在调试期间设法获得的调试器错误和调用堆栈:

enter image description here

看起来Core析构函数根本没有调用。为什么会这样?怪异!!!

你告诉我我的错误在哪里?感谢。

1 个答案:

答案 0 :(得分:2)

当主线程从main()返回时,它会在终止整个过程之前开始拆除环境。所有这些当后台线程正在访问对象时,它们已被破坏或已被破坏。

我不确定你要实现什么,但你做错了什么:

  • 你的lambda应该执行一些工作并在完成后立即返回,例如你永远不应该永远地循环。
  • 您的主要话题应该通过致电std::future<T>::get()来等待您的未来。