c – 履行(可能是空白)的承諾
我正在編寫一些多執行緒程式碼,並使用promise / future來在不同的執行緒上呼叫一個函式並返回其結果.為了簡單起見,我將完全刪除執行緒部分:
template <typename F> auto blockingCall(F f) -> decltype(f()) { std::promise<decltype(f())> promise; // fulfill the promise promise.set_value(f()); // block until we have a result return promise.get_future().get(); }
這對任何返回無效的函式都很有用.而獲得未來的返回宣告也適用於void.但是,如果f是一個void函式,我不能履行承諾,因為:
promise.set_value(f()); //error : invalid use of void expression
有沒有一些聰明的方法來設定在void case中的值,或者我只需要編寫一個幫助函式,如call_set_value(promise,f),它具有std :: promise<R>和std :: promise<void>?
template <typename F> auto blockingCall(F f) -> decltype(f()) { std::packaged_task<decltype(f())()> task(std::move(f)); task(); // block until we have a result return task.get_future().get(); }
注:根據當前的標準,如果task()和task.get_future()發生在單獨的執行緒上(並且您的原始使用承諾也是如此),則此程式碼將進行資料競爭,因此在將任務交給之前應呼叫get_future()另一個執行緒.實際上,實際應用應該是安全的,有一個圖書館問題(ofollow,noindex" target="_blank">LWG 2412 )使其有效.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/27533373/fulfill-a-possibly-void-promise