2016-04-19 18 views
5

Böyle kod var:Tüm std :: futures bitmeden önce işlevden dönmek güvenli midir?

int function() 
{ 
    std::vector<std::future<int>> futures; 
    for (const auto& elem : elements) 
    { 
     futures.push_back(std::async(&MyClass::foo, myClass, elem); 
    } 
    for (auto& f : futures) 
    { 
     const int x = f.get(); 
     if (x != 0) 
      return x; 
    } 
} 

Ben bitmemiş zaman uyumsuz aramaları olduğunda işlevinden iade edebilir miyim? Sadece sıfır olmayan bir değerle ilgileniyorum. Tüm async aramaları bitene kadar beklemeli miyim? Bu kod güvenli mi? std::future (std::async numaralı bir aramaya başlatıldığında) yıkıcı, eş zamanlı olmayan görev tamamlanana kadar bloklar.

+0

"Güvenli" ne anlama geliyor? –

+0

Kaza, tanımlanmamış davranış ya da bunun gibi bir şey. Sadece sıfır olmayan bir değer elde etmek ve diğerlerini görmezden gelmek istiyorum. Programımın her zaman böyle davranmasını istiyorum. Başka bir deyişle, bu kodda herhangi bir tehlike var mı? Diğerleri async çağrıları bitip gelecek futures'ları olmayacaksa ne olacağını bilmiyorum. – peter55555

+6

Programınızda tanımlanmamış davranış yok. Ancak, dönmeden önce tüm asenkron işlemlerin tamamlanmasını engelleyebilir. –

cevap

7

(See here)

Yani tüm görevler tamamlanana kadar işleviniz return ifadesi tamamlanmayacaktır.

İlgili konular