我明白什麼是std :: future,但我不明白何時和如何使用std :: shared_future和std :: promise,並且我找不到在線好的解釋。C++什麼是std :: shared_future和std :: promise
我會感謝一些幫助,包紮我的頭。
通過例子來這裏的路上是不是真的清楚http://en.cppreference.com/w/cpp/thread/shared_future
我明白什麼是std :: future,但我不明白何時和如何使用std :: shared_future和std :: promise,並且我找不到在線好的解釋。C++什麼是std :: shared_future和std :: promise
我會感謝一些幫助,包紮我的頭。
通過例子來這裏的路上是不是真的清楚http://en.cppreference.com/w/cpp/thread/shared_future
std::shared_future
是當你需要有一個std::future
的多個有效副本,以及可能有多個消費者說:std::future
。您可以將std::future
轉換爲std::shared_future
。
考慮std::future
:std::shared_future
要像std::unique_ptr
:std::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
。
當且僅當您撥打in
int
out
未來將準備好。
所以你可以有一個函數返回一個std::future<Bitmap>
。您有一些網絡代碼需要傳輸位圖。因此,您創建promise_pipe<Bitmap>
,返回std::future<Bitmap>
,並在位圖到達時將in
存儲在「待辦事項」列表中。
當位圖已經完全到達時,您只需要in(Bitmap)
和任何正在等待future
的人都會收到通知。
promise
s爲設計爲允許程序員產生自己future
S,而不僅僅是使用由std
庫中創建的那些對象。
現在,packaged_task
通常比std::promise
更容易使用,並且具有相同的用途。
尋找教程或外部解釋的建議在Stack Overflow中是無關緊要的。 –
有幫助的例子呢? – darkThoughts
@AlexanderHuszagh在這個問題上我沒有看到任何外部資源的請求。我看到一份聲明,表示OP不會找到外部資源,但他並沒有要求我們提供一個。 –