如何完成标准::异步
How to finalize std::async
下面是一个示例代码:
struct T
{
T()
{
task = std::async(std::launch::async, [this]()
{
while(work)
{
//do something
}
});
}
~T()
{
work = false;
}
std::future<void> task;
std::atomic_bool work;
};
我应该以某种方式在析构函数中完成 future 还是上面的代码可以
你显示的代码不行,但不是出于你认为的原因。由于task
所指的共享状态是由std::async
创建的,std::future
的d'tor在摧毁task
时会阻塞。但这仍然对你没有帮助。
问题是类的成员以与其初始化相反的顺序销毁。由于work
是最后初始化的,因此它将在task
之前被销毁。因此,即使您将其设置为 false
,您的任务在循环中运行检查时实际上可能引用了一个死对象。所以你的手上会有不确定的行为。
您可以通过在task
之前移动work
来解决它,因此它的寿命更长。或者,您可以在 T
的析构函数中显式调用 task.wait()
。我个人认为后者更清楚。
相关文章:
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- C ++异步键盘输入(标准方式)
- C++17 标准::异步非阻塞执行
- 控制与标准::异步的并行度
- VS2015 标准::异步奇怪
- 我怎样才能把这个标准::函数传递给标准::异步
- 如何完成标准::异步
- 修复此标准::异步调用
- 条件标准::未来和标准::异步
- 英特尔® IPP 异步 C/C++ 库是否包含在标准 IPP 库中?