从来没有从std :: packaged_task检索std :: future的结果是否安全?

时间:2016-05-31 02:55:07

标签: c++ c++11 stdthread packaged-task

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_taskget()上调用返回的结果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 ++文档中找不到关于这种使用模式的任何内容,所以我想确保它得到官方支持。

1 个答案:

答案 0 :(得分:0)

这取决于您认为对您的计划安全的内容 对于您所显示的背景,它的安全性如下:

  • future上执行get之前,它不会阻止。如果未来是使用std::async创建的,并且如果在销毁之前没有在其上调用get,那么它将被阻塞直到结果可用。
    请在此处查看更多内容:http://en.cppreference.com/w/cpp/thread/future/~future
  

这些操作不会阻止共享状态准备就绪,   如果以下所有条件都成立则可能会阻止:共享   state是通过调用std :: async创建的,共享状态还没有   准备就绪,这是对共享状态的最后一次引用。

现在,如果Result类持有非拥有内存(无论出于何种原因)或需要手动释放的其他资源,该怎么办?在这种情况下,代码的正确性变得有问题。最好的办法是将它发送到一些后台线程,以便缓慢移动任务。