[英]Is shared_future<void> a legitimate replacement for a condition_variable?
Josuttis陳述[“標准圖書館”,第2版,第1003頁]:
期貨允許您阻止,直到提供另一個線程的數據或完成另一個線程。 但是,未來只能將數據從一個線程傳遞到另一個線程。 事實上,未來的主要目的是處理線程的返回值或異常。
另一方面, 多個線程可以使用shared_future<void>
來識別另一個線程何時完成其工作。
此外,通常,高級並發功能(例如future
s)應該優先於低級別的功能(例如condition_variable
s)。
因此,我想問:是否有任何情況(需要同步多個線程),其中shared_future<void>
是不夠的, condition_variable
是必不可少的?
作為由@TC和@hlt,使用的評論已經指出, future
S / shared_future
S IN這個意義上,他們只能使用一次大多局限於。 因此,對於每個通信任務,您都必須擁有新feature
。 Scott Meyers在以下方面很好地解釋了優點和缺點:
第39項:考慮一次性事件通信的無效期貨。
Scott Meyers:有效的現代C ++(強調我的)
他的結論是,使用promise
/ future
對condidition_variable
使用condidition_variable
的許多問題,提供一種更好的方式來傳達一次性事件。 要付出的代價是您為共享狀態使用動態分配的內存,更重要的是,您必須為要通信的每個事件都有一個promise
/ future
對。
雖然使用高級摘要而不是低級摘要的概念值得稱贊,但這里存在誤解。 std::future
不是std::conditional_variable
的高級替換。 相反,它是針對std::condition_variable
的特定用例的特定高級構造構建 - 即,一次性返回值。
顯然,並非所有條件變量的使用都適用於此場景。 例如,無論您嘗試多少,都無法使用std::future
實現消息隊列。 這樣的線程是另一個基於低級構建塊的高級構造。 所以是的,拍攝高級構造,但不要指望高級和低級之間的一對一地圖映射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.