从std::future
创建std::packaged_task
是否安全,该#include <future>
#include <thread>
class Result {
Result() {}
~Result() {}
};
void foo() {
std::packaged_task<Result()> task(..);
auto future = task.get_future();
std::thread thread(std::move(task), ...);
thread.detach();
if (future.wait_for(std::chrono::milliseconds(timeout_ms)) == std::future_status::ready) {
auto result = future.get(); <--- Task didn't take too long, retrieve future result
...
}
} <--- Task is taking too long, just abort and never call future.get()
在单独的线程上执行,但并不总是检索其结果?
~Result()
它似乎适用于Clang / libc ++:std::packaged_task
在get()
上调用返回的结果std::future
最终会调用var app = angular.module('app', []);
app.controller('firstCtrl', function($scope){
$scope.title = 'OneFC';
})
app.controller('secondCtrl', function($scope){
$scope.title = 'UFC';
})
app.controller('indexCtrl', function(){
// i want to get the title here depends on the active state in ui-router.
}
,但use strict;
最终调用this.Main = this;
因为我在C ++文档中找不到关于这种使用模式的任何内容,所以我想确保它得到官方支持。
答案 0 :(得分:0)
这取决于您认为对您的计划安全的内容
对于您所显示的背景,它的安全性如下:
future
上执行get
之前,它不会阻止。如果未来是使用std::async
创建的,并且如果在销毁之前没有在其上调用get
,那么它将被阻塞直到结果可用。
这些操作不会阻止共享状态准备就绪, 如果以下所有条件都成立则可能会阻止:共享 state是通过调用std :: async创建的,共享状态还没有 准备就绪,这是对共享状态的最后一次引用。
现在,如果Result
类持有非拥有内存(无论出于何种原因)或需要手动释放的其他资源,该怎么办?在这种情况下,代码的正确性变得有问题。最好的办法是将它发送到一些后台线程,以便缓慢移动任务。