我试图以异步方式运行某些功能。为此我编写了一个名为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
出现此错误:
这是我在调试期间设法获得的调试器错误和调用堆栈:
看起来Core
析构函数根本没有调用。为什么会这样?怪异!!!
答案 0 :(得分:2)
当主线程从main()返回时,它会在终止整个过程之前开始拆除环境。所有这些当后台线程正在访问对象时,它们已被破坏或已被破坏。
我不确定你要实现什么,但你做错了什么:
std::future<T>::get()
来等待您的未来。