C++11之std::future对象的基本用法

Posted 小丑_jk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11之std::future对象的基本用法相关的知识,希望对你有一定的参考价值。

1、

// future example
#include <iostream>       // std::cout
#include <future>         // std::async, std::future
#include <chrono>         // std::chrono::milliseconds
// a non-optimized way of checking for prime numbers:
bool is_prime (int x) 
  for (int i=2; i<x; ++i) if (x%i==0) return false;
  return true;

int main ()

  // call function asynchronously:
  std::future<bool> fut = std::async (is_prime,444444443); 

  // do something while waiting for function to set future:
  std::cout << "checking, please wait";
  std::chrono::milliseconds span (100);
  while (fut.wait_for(span)==std::future_status::timeout)
    std::cout << \'.\' << std::flush;

  bool x = fut.get();     // retrieve return value

  std::cout << "\\n444444443 " << (x?"is":"is not") << " prime.\\n";

  return 0;

2、

// promise example
#include <iostream>       // std::cout
#include <functional>     // std::ref
#include <thread>         // std::thread
#include <future>         // std::promise, std::future

void print_int (std::future<int>& fut) 
  int x = fut.get();
  std::cout << "value: " << x << \'\\n\';


int main ()

  std::promise<int> prom;                      // create promise
  std::future<int> fut = prom.get_future();    // engagement with future
  std::thread th1 (print_int, std::ref(fut));  // send future to new thread
  prom.set_value (10);                         // fulfill promise                                               // (synchronizes with getting the future)
  th1.join();
  return 0;

3、

// packaged_task example
#include <iostream>     // std::cout
#include <future>       // std::packaged_task, std::future
#include <chrono>       // std::chrono::seconds
#include <thread>       // std::thread, std::this_thread::sleep_for
// count down taking a second for each value:
int countdown (int from, int to) 
  for (int i=from; i!=to; --i) 
    std::cout << i << \'\\n\';
    std::this_thread::sleep_for(std::chrono::seconds(1));
  
  std::cout << "Lift off!\\n";
  return from-to;

int main ()

  std::packaged_task<int(int,int)> tsk (countdown);   // set up packaged_task
  std::future<int> ret = tsk.get_future();            // get future

  std::thread th (std::move(tsk),10,0);   // spawn thread to count down from 10 to 0
  // ...
  int value = ret.get();                  // wait for the task to finish and get result
  std::cout << "The countdown lasted for " << value << " seconds.\\n";
  th.join();
  return 0;

 

异常传播和 std::future

【中文标题】异常传播和 std::future【英文标题】:Exception propagation and std::future 【发布时间】:2013-01-08 19:49:38 【问题描述】:

我的理解是,当异步操作抛出异常时,会被传播回调用std::future::get()的线程。然而,当这样的线程调用std::future::wait() 时,异常不会立即传播——它会在随后调用std::future::get() 时被抛出。

但是,在这种情况下,如果未来对象在调用std::future::wait() 之后但在调用std::future::get() 之前超出范围,那么这种异常应该发生什么?

对于那些感兴趣的人,这里是一个简单的例子。在这种情况下,异常由 thread/future 包静默处理:

#include "stdafx.h"
#include <thread>
#include <future>
#include <iostream>

int32_t DoWork( int32_t i )

    std::cout << "i ==  " << i << std::endl;
    throw std::runtime_error( "DoWork test exception" );
    return 0;


int _tmain(int argc, _TCHAR* argv[])

    auto f = std::async( DoWork, 5 );
    try
    
        //f.get();     // 1 - Exception does propagate.
        f.wait();      // 2 - Exception does NOT propagate.
    
    catch( std::exception& e )
    
        std::cout << e.what() << std::endl;
        return -1;
    
    return 0;

【问题讨论】:

认为异常没有发生任何事情,它只是被忽略了。 (但我对此还不够熟悉,无法确定。) 我想重要的是要注意异常是由std::exception_ptrs 跨线程传播的。所以对于系统来说,异常看起来会被捕获和处理,直到传播机制决定重新抛出它。 【参考方案1】:

它被忽略和丢弃,就像你 wait() 获取一个值但从不 get() 它一样。

wait() 只是说“阻塞,直到未来准备好”,即准备好值或异常。实际get() 值(或异常)取决于调用者。通常你只会使用get(),无论如何它都会等待。

【讨论】:

啊!我会买这个,但它令人困惑 - 特别是如果 std::async 创建的 std::future 具有 void 结果类型。为这样的未来调用 get() 感觉很奇怪。 @Bukes:嘿,我能看到。但是不要把future&lt;T&gt;想成“T的结果”,把它想成“T的计算结果”,当然可以例外。 @GManNickG 如果函数返回 void 那么你不认为调用 wait() 而不是 get() 有意义吗 @GManNickG 如果函数返回 void 那么你不认为调用 wait() 而不是 get() 有意义吗

以上是关于C++11之std::future对象的基本用法的主要内容,如果未能解决你的问题,请参考以下文章

std::future的基本用法

c++11 future promise

C++11 多线程 asyncfuturepackaged_taskpromise

C11线程管理:异步操作

folly教程系列之:future/promise

[C++11 多线程异步] --- std::promise/std::future