2012-02-11 23 views
9

std :: async, std :: launch ilkesini ilk argüman olarak alan bir aşırı yüklenmeye sahip. Bu aşırı yükü ne zaman kullanmalıyım? Farklı politikalar nelerdir? (Senkronizasyon ve uyumsuzluğun iki seçenek olduğunu düşünüyorum). Senkronizasyon politikasını ne zaman kullanmalıyım? Bu, doğrudan onu çalıştırmaktan nasıl farklıdır?std :: async'i eşitleme ile ilke olarak ne zaman kullanmalıyım?

+2

http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-8-futures-and-promises.html ---> Bu yararlı olabilir – Jagannath

cevap

5

the very helpful article that Jagannath linked özeti ve olası kullanımlar hakkındaki yorumlar.

  • any:

    3 fırlatma politikaları vardır kütüphane bir iş parçacığı a yumurtlamaya veya verilip seçtiği değil

  • async: Bir iplik
  • deferred
  • çatallanabilir için açıkça soruyorum: Size açıkça bir iş parçacığı için değil sormak,nedenle

çatallanabilir içinpolitikası, deterministik tembel değerlendirmenin (çağrıya ihtiyaç olarak da bilinir) alınmasının bir yoludur. Örneğin, sahip olduğunu varsayalım:

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()); 
} 

Şimdi, bu tamsayı değeri hesaplama ise uzun, o zaman bunu hesaplamak için biraz ziyan (örneğin, bir ağ gidiş dönüş çağırmak olabilir) tüm gerçekten gerektirmeyen durumlar ... ve şimdi bunu yapacak bir araç var! hesaplama sonraki çağrılar hep olsun aynı sonuç için garanti, ilk ve son kez için yapılır çünkü bu, bir std::function<int()> (ve bir kapatma) kullanmaktan ustaca farklı olduğunu

void func(MyClass& mc) { 
    std::future<int> f = std::async(std::launch::deferred, []() { 
         return stoi(memcached.get("KEY")); 
         }); 

    mc.lazy(f); 
} 

Not.

Diğer ilkelerle arasındaki fark, değerine gerek duymadığınız zaman işlemin gerçekleştirilip gerçekleştirilmediğine de ifade edilebilir.

  • any: gerçekleştirilmez

: Başka bir iş parçacığı

  • deferred tarihinde yapılacaktır: (proaktif) ya da hepsi değil
  • async gerçekleştirilir başka bir iş parçacığı üzerinde gerçekleştirilen olabilir Bu nedenle, deferred size daha iyi kontrol sağlar, bu da aramanın bir yan etkisinin bulunması durumunda önemlidir.

  • +1

    "eşitleme" işlevi Aslında std :: launch :: deferred' – Cubbi

    +0

    @Cubbi: İşaretlediğiniz için teşekkürler, Standart ile çapraz kontrol etmeliydim. –

    +0

    “get()' ifadesi “geleceği” geçersiz kıldığından, “get()' ”çağrısının sonraki çağrıları tanımsız davranışı çağırır. Geçersizlikten kaçınmak için bir 'shared_future 'gerekir. –

    İlgili konular