2014-09-10 23 views
15

Paketlenmiş görevleri kullanırken çok garip bir şeyle karşılaşıyorum. ~packaged_task okurken, bir std::packaged_task çalıştırılmadan önce imha edilirse, sözün kırılması ve geleceğinden sonuç elde etme girişiminin std::future_error atması gerektiği izlenimini edinirim. Ancak, Visual Studio 2013'te bu durum böyle görünmüyor. Bu Aşağıdaki kodu alın: Ben yürütülecek paketlenmiş görev için bekleyen bir std::future_error engeller f.get() üzerinde ancak bunun yerine almak için bekliyorumstd :: packaged_task imha üzerindeki sözleri kırmıyor mu?

#include <iostream> 
#include <future> 
#include <functional> 

int main() { 
    std::future<int> f; 
    { 
     std::packaged_task<int()> task([](){return 3; }); 
     f = task.get_future(); 
    } 
    std::cout<<f.get()<<std::endl; 
    return 0; 
} 

.

başka derleyici çalışılıyor: http://ideone.com/Wt0WOc gerçekten ben Visual Studio 2013 bir hata görmeye ya da ben bir şey kaçırmış bir std::future_error("Broken promise") ...

Am atmak geliyor?

cevap

10

Sen ;-) hala doğru olduğunu düşünüyorum olabilir doğru. ~packaged_task(), paylaşılan durumu (§30.6.9.1 [futures.task.members]/p9) terk eder, yani, paylaşılan durum hazır değilse, future_error türünde bir istisna nesnesi broken_promise hata koşuluyla depolanır, ardından paylaşılan duruma getirilir hazır; ve ardından paylaşılan durumu serbest bırakarak (§30.6.4 [futures.state]/p7).

Bu known bug olduğunu Aynı zamanda CTP içinde düzeltilenekadar 2015 yılında biraz zaman çıkıp muhtemeldir ancak üretim kodu için o kullanmak oldukça kötü bir fikir Visual Studio sonraki sürümünde will be fixed o ..

+0

Bu bağlantıları doğru şekilde okudum, bu VS 2013'te düzeltilmeyecek mi? –

+0

@EmilyL. Çok az ihtimal var. [Bu sayfanın SSS bölümünde yer alan Q5] 'e göre (http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking -changes-in-vs-2013.aspx), sadece nadiren hata düzeltmelerini geri yüklerler. –

+2

Harika, satın aldığımız stüdyo neredeyse bir yaşında ve zaten bizi bir çimdik içinde bırakıyorlar. * iç çek * Onay için teşekkürler. Bu cevabı kabul etmek, son teyidi şüphelerime koydu. –

7

Sanırım bir hata, standart ~packaged_task'un paylaşılan durumu terk ettiğini söylüyor, bu da henüz hazır değilse, broken_promise istisnasının saklanması ve beklediğiniz gibi durumu hazır duruma getirmesi gerektiği anlamına gelir.

Tam açıklama: senin ideone.com testi GCC kullanır ve ben hayata GCC en <future> yüzden ben onun davranış doğrudur derken önyargılı ... ama

+0

Tamamen kabul edildi. Terk edilmiş bir 'gelecek '(yani bu durumda geri dönüş değeri), *' broken_promise' için bir durumdur. – starturtle

İlgili konular