簡體   English   中英

shared_future <void>是condition_variable的合法替代品嗎?

[英]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 / futurecondidition_variable使用condidition_variable的許多問題,提供一種更好的方式來傳達一次性事件。 要付出的代價是您為共享狀態使用動態分配的內存,更重要的是,您必須為要通信的每個事件都有一個promise / future對。

雖然使用高級摘要而不是低級摘要的概念值得稱贊,但這里存在誤解。 std::future不是std::conditional_variable的高級替換。 相反,它是針對std::condition_variable的特定用例的特定高級構造構建 - 即,一次性返回值。

顯然,並非所有條件變量的使用都適用於此場景。 例如,無論您嘗試多少,都無法使用std::future實現消息隊列。 這樣的線程是另一個基於低級構建塊的高級構造。 所以是的,拍攝高級構造,但不要指望高級和低級之間的一對一地圖映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM