2012-02-11 52 views
9

std :: async有一個超載,它將std :: launch策略作爲第一個參數。我應該何時使用這種超載?有哪些不同的政策可用? (我認爲同步和異步是兩種選擇)。我應該何時使用同步策略?與直接運行它有何不同?什麼時候應該將std :: async與sync同時用作策略?

+2

http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html --->這可能有幫助 – Jagannath 2012-02-11 12:19:00

回答

5

摘要從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可以提供更好的控制,如果通話有副作用,這一點很重要。

  • +1

    「同步」是實際上'std :: launch :: deferred' – Cubbi 2012-02-11 17:18:35

    +0

    @Cubbi:謝謝指出,我應該與標準進行交叉檢查。 – 2012-02-12 12:46:23

    +0

    「隨後對'get()'的調用將調用未定義的行爲,因爲'get()'使'future'失效。你需要一個'shared_future'來避免失效。 – 2015-02-22 15:13:27

    相關問題