2016-07-02 9 views
0

オブジェクトDelayを非同期で構築し、(別のスレッドから)そのオブジェクトから関数fooを繰り返し呼び出すようにします。std :: future :: getを繰り返し呼び出す

struct Delay { 
    Delay(int d) { 
     sleep(d); 
    } 
    void foo() { } 
}; 

struct Test { 
    Test() { 
     x = async(std::launch::async, 
        [&]() {return std::make_unique<Delay>(4);}); 
    } 
    void run() { x.get()->foo(); } 
    std::future<std::unique_ptr<Delay>> x; 
}; 

int main() { 
    auto t = Test(); 
    // do other stuff... 
    t.run(); 
    t.run(); // throwing an instance of 'std::future_error', "No associated state" 
    return 0; 
} 

しかし明らかに、2回目のx.get()が呼び出されると、例外がスローされます。

このような状況に対処するには、どのような方法が推奨されますか?以下に示すようなフラグを使用すると、ハックのように見えます。より良い方法がありますか?

bool is_set = false; 
std::unique_ptr<Delay> ptr; 
void run_ptr() { 
    if (!is_set) { 
     ptr = x.get(); 
     is_set = true; 
    } 
    ptr->out(); 
} 

答えて

1

std::shared_futureは、このような状況に対処するための推奨方法です。

未来から移動して構築でき、その状態の複数のリーダーをサポートします。ワン・デリバリー・フューチャーは特定のパフォーマンスの向上をもたらし、必要な場合には将来を共有することは非常に些細なので、それは明確な目的です。

xのタイプをshared_future<std::unique_ptr<Delay>>に変更するだけで完了です。

上記のケースでは、unique_ptrレイヤーはほとんど無意味です。おそらく本当の問題ではないでしょう。

関連する問題