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 に答える