我試圖確定何時可以安全地撥打wait()
std::future
和std::shared_future
。我從來沒有撥打get()
上的future
,並且future
已經準備好從對其承諾的相應承諾set_value()
方法。在std :: future上多次調用wait()並從多個線程安全地調用?
我想等這個future
(使用wait()
,wait_for()
,wait_until()
)從多個線程。在promise::set_value()
已被呼叫立即返回之後,我也希望撥打wait()
。
從http://www.cplusplus.com/reference/future/future/wait/
調用未來的對象是無效的,在這個成員函數產生不確定的行爲
獲取從promise
一個future
與valid()==true
開始其關閉。據我所見,只有future::get()
集valid()
回到假。這個假設是否正確?我可以根據需要經常撥打wait()
系列功能嗎?諾言的價值設定後,將立即撥打wait()
立即返回?我可以從多個線程調用它們嗎?
我不確定簡單地做一個函數'const'保證它*線程安全*。規範提到這是一個要求嗎? – Galik 2014-11-22 14:51:30
我不喜歡使用「線程安全」這個詞,因爲它對不同的人意味着不同的事情。 17.6.5.9 [res.on.data.races]表示標準庫必須確保在一個對象上調用(僅)'const'成員函數不會引入數據競爭。如果對象具有與其他對象共享的狀態(如'將來'那樣),則庫必須提供其自己的同步以防止競賽。這並不意味着簡單地添加'const'就是提供線程安全的magic pixie dust,這意味着庫有時需要做額外的工作來爲'const'函數提供保證。 – 2014-11-22 14:52:10
簡單的事實,'wait()'是'const'只是保證函數不會修改對象的狀態。然而,它並不保證結果與其他線程所做的更改保持一致/同步。 – Christophe 2014-11-22 15:05:34