15

我的理解是,当异步操作抛出异常时,它会被传播回调用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;
}
4

2 回答 2

23

它被忽略和丢弃,就像你想要wait()一个价值但从来没有get()它一样。

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

于 2013-01-08T20:19:06.663 回答
-1

vs2012\vc11\crt\future.cpp

有一个错误

static const char *const _Future_messages[] =
{   // messages for future errors
"broken promise",
"future already retrieved",
"promise already satisfied",
"no state"
};

此代码生成对“_Future_messages”的无效访问权限,因为 _Mycode.value() 返回 4。

    const char *__CLR_OR_THIS_CALL what() const _THROW0()
    {   // get message string
    return (_Get_future_error_what(_Mycode.value()));
    }

// 代码示例

    std::future<int> empty;
try {
    int n = empty.get();
} catch (const std::future_error& e) {
   const error_code eCode = e.code();
   char *sValue = (char*)e.what();
   std::cout << "Caught a future_error with code " << eCode.message()
              << " - what" << sValue << endl;
}
于 2013-10-16T10:24:13.540 回答