std::async 和 std::shared_future 导致程序崩溃
std::async and std::shared_future causes the program to fall
我正在尝试 运行 以异步方式执行某些功能。为此,我写了 class 调用 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
析构函数根本没有调用。为什么会这样?奇怪!!!
你能告诉我我的错误在哪里吗?谢谢。
当主线程从 main() returns 开始时,它会在终止整个进程之前开始拆除环境。所有这些都是在后台线程访问正在被销毁或已经被销毁的对象时进行的。
我不确定你想达到什么目的,但你做错了什么:
- 您的 lambda 应该执行一些工作,并且 return 完成后立即执行,例如你不应该永远循环。
- 您的主线程应该通过调用
std::future<T>::get()
等待您的未来完成。
我正在尝试 运行 以异步方式执行某些功能。为此,我写了 class 调用 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
析构函数根本没有调用。为什么会这样?奇怪!!!
你能告诉我我的错误在哪里吗?谢谢。
当主线程从 main() returns 开始时,它会在终止整个进程之前开始拆除环境。所有这些都是在后台线程访问正在被销毁或已经被销毁的对象时进行的。
我不确定你想达到什么目的,但你做错了什么:
- 您的 lambda 应该执行一些工作,并且 return 完成后立即执行,例如你不应该永远循环。
- 您的主线程应该通过调用
std::future<T>::get()
等待您的未来完成。