2017-07-27 154 views
2

我明白什麼是std :: future,但我不明白何時和如何使用std :: shared_future和std :: promise,並且我找不到在線好的解釋。C++什麼是std :: shared_future和std :: promise

我會感謝一些幫助,包紮我的頭。

通過例子來這裏的路上是不是真的清楚http://en.cppreference.com/w/cpp/thread/shared_future

+0

尋找教程或外部解釋的建議在Stack Overflow中是無關緊要的。 –

+0

有幫助的例子呢? – darkThoughts

+1

@AlexanderHuszagh在這個問題上我沒有看到任何外部資源的請求。我看到一份聲明,表示OP不會找到外部資源,但他並沒有要求我們提供一個。 –

回答

4

std::shared_future是當你需要有一個std::future的多個有效副本,以及可能有多個消費者說:std::future。您可以將std::future轉換爲std::shared_future

考慮std::futurestd::shared_future要像std::unique_ptrstd::shared_ptr


std::promise是生成一個std::future的一種方式。

template<class T> 
std::future<std::decay_t<T>> make_ready_future(T&& t) { 
    std::promise<std::decay_t<T>> pr; 
    auto r = pr.get_future(); 
    pr.set_value(std::forward<T>(t)); 
    return r; 
} 

這是std::promise,我在那裏坐T玩具例子,我從產生它已經準備好std::future<T>

如果您的代碼需要關閉線程,或者可能已經計算好了,則可以從中返回std::future<T>。如果未計算,則返回std::async(...)呼叫的結果。如果已經計算好了,則返回make_ready_future(calculated value)

稍微更復雜的情況:

template<class T> 
struct promise_pipe { 
    std::future<T> out; 
    std::function<void(T)> in; 
    promise_pipe() { 
    auto pr = std::make_shared<std::promise<T>>(); 
    out = pr->get_future(); 
    in = [pr](T t)mutable{ 
     if (pr) pr->set_value(std::forward<T>(t)); 
     pr = {}; 
    }; 
    } 
}; 

在這裏,我已經寫了promise_pipe

A promise_pipe<int>有兩個字段 - 一個std::future<int> out和一個std::function<void(int)> in

當且僅當您撥打inintout未來將準備好。

所以你可以有一個函數返回一個std::future<Bitmap>。您有一些網絡代碼需要傳輸位圖。因此,您創建promise_pipe<Bitmap>,返回std::future<Bitmap>,並在位圖到達時將in存儲在「待辦事項」列表中。

當位圖已經完全到達時,您只需要in(Bitmap)和任何正在等待future的人都會收到通知。


promise s爲設計爲允許程序員產生自己future S,而不僅僅是使用由std庫中創建的那些對象。

現在,packaged_task通常比std::promise更容易使用,並且具有相同的用途。

相關問題