可能重复:
有没有办法在 C++11 中取消/分离未来?
有一个使用std::future
and异步运行的成员函数std::async
。在某些情况下,我需要取消它。(该函数在对象附近连续加载,有时对象在加载时超出范围。)我已经阅读了解决同一问题的这个问题的答案,但我无法让它工作。
这是与我的实际程序具有相同结构的简化代码。在异步运行时调用Start()
andKill()
会导致崩溃,因为input
.
在我看来,代码应该如下工作。当Kill()
被调用时,运行标志被禁用。下一个命令get()
应该等待线程结束,因为它会检查运行标志,所以它很快就会结束。线程取消后,input
指针被删除。
#include <vector>
#include <future>
using namespace std;
class Class
{
future<void> task;
bool running;
int *input;
vector<int> output;
void Function()
{
for(int i = 0; i < *input; ++i)
{
if(!running) return;
output.push_back(i);
}
}
void Start()
{
input = new int(42534);
running = true;
task = async(launch::async, &Class::Function, this);
}
void Kill()
{
running = false;
task.get();
delete input;
}
};
似乎线程没有注意到将运行标志切换为假。我的错误是什么?