std :: async有一個超載,它將std :: launch策略作爲第一個參數。我應該何時使用這種超載?有哪些不同的政策可用? (我認爲同步和異步是兩種選擇)。我應該何時使用同步策略?與直接運行它有何不同?什麼時候應該將std :: async與sync同時用作策略?
回答
摘要從the very helpful article that Jagannath linked,並評論可能的用途。
有3種啓動策略:
any
:庫選擇是否產生一個線程或不async
:你明確要求線程催生deferred
:你明確請求一個線程不是被產生
因此,deferred
政策是獲得確定性懶惰評估(也稱爲按需呼叫)的方式。例如,假設您有:
void MyClass::lazy(std::future<int> const& f) {
if (this->notReady()) { return; }
if (this->stillNotReady()) { return; }
if (this->value() == 42) { return; }
this->go(f.get());
}
現在,如果計算這個整數的值是長(例如,它可以調用網絡往返),然後它有點浪費計算它在所有那些並不需要它的案例......現在我們已經有了這樣的工具!
void func(MyClass& mc) {
std::future<int> f = std::async(std::launch::deferred, []() {
return stoi(memcached.get("KEY"));
});
mc.lazy(f);
}
注意,這是從使用std::function<int()>
(和閉合)微妙的不同,因爲計算完一勞永逸,保證後續調用總是得到返回相同的結果。
與其他策略的區別也可以表示是否執行操作當您不需要值時。
any
:將不進行
:將在另一個線程
deferred
進行:可能會在另一個線程在所有async
(主動)或不執行進行因此,deferred
可以提供更好的控制,如果通話有副作用,這一點很重要。「同步」是實際上'std :: launch :: deferred' – Cubbi 2012-02-11 17:18:35
@Cubbi:謝謝指出,我應該與標準進行交叉檢查。 – 2012-02-12 12:46:23
「隨後對'get()'的調用將調用未定義的行爲,因爲'get()'使'future'失效。你需要一個'shared_future'來避免失效。 – 2015-02-22 15:13:27
- 1. 什麼時候應該使用async/await,什麼時候不用?
- 2. 什麼時候我需要使用std :: async(std :: launch :: async,func())而不是func()?
- 3. node js什麼時候應該使用a-sync機制
- 4. 什麼時候應該在vcl_recv和vcl_fetch下添加相同的策略?
- 5. 什麼時候應該使用AWS,什麼時候不使用
- 6. 什麼時候應該實現std :: convert :: From vs std :: convert :: Into?
- 7. 什麼時候應該使用sed,什麼時候應該使用awk
- 8. 什麼時候應該使用memcpy,什麼時候應該使用memmove?
- 9. 什麼時候應該使用Import-Package,什麼時候應該使用Require-Bundle?
- 10. 用std :: launch :: sync模擬std :: async?
- 11. 什麼時候應該使用std :: thread :: detach?
- 12. 什麼時候應該擴展NSDocument,什麼時候應該擴展NSWindowController?
- 13. 我們什麼時候應該上課,什麼時候不應該上課
- 14. 什麼時候應該使用datagrid,何時應該使用datagridview?
- 15. 什麼時候應該使用$(object),何時應該使用$ object?
- 16. 什麼時候應該使用FSharpFunc.Adapt?
- 17. 什麼時候應該使用_aligned_malloc()?
- 18. 什麼時候應該使用`use`?
- 19. 什麼時候應該使用$ rootScope?
- 20. 什麼時候應該使用$(document).ready?
- 21. 什麼時候應該使用html5 sessionStorage?
- 22. 什麼時候應該調用javax.jdo.Query.close(Object)?
- 23. 什麼時候應該使用OWIN Katana?
- 24. 什麼時候應該使用流?
- 25. 什麼時候應該調用realm.close()?
- 26. 什麼時候應該使用Promises?
- 27. 什麼時候應該使用setScriptTimeout?
- 28. 什麼時候應該使用助手?
- 29. 什麼時候應該使用Datomic?
- 30. 我什麼時候應該使用javax.swing.SwingUtilities.invokeLater()?
http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html --->這可能有幫助 – Jagannath 2012-02-11 12:19:00