2014-09-10 1 views
15

패키지 태스크를 사용할 때 매우 이상한 것이 있습니다. ~packaged_task을 읽을 때 std::packaged_task이 실행되기 전에 파괴되면 약속이 깨지고 미래의 결과를 얻으려고하면 std::future_error을 던져야한다는 인상을받습니다.std :: packaged_task 파괴시 약속을 어기 지 않으시겠습니까?

그러나 Visual Studio 2013에서는 그렇지 않습니다. 이 다음 코드를 가지고 : 나는 실행하기 위해 포장 작업을 기다리고, std::future_error 차단 f.get()에 대신을 얻을 것으로 기대하고 있습니다

#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; 
} 

.

다른 컴파일러를 시도 : http://ideone.com/Wt0WOc 실제로 내가 비주얼 스튜디오 2013의 버그를 보거나 내가 뭔가를 놓친 가지고 std::future_error("Broken promise") ...

암을 던져 무엇입니까?

답변

10

당신은 ;-) 여전히 올바른 생각 될 수있다 옳은. ~packaged_task()은 공유 상태 (§30.6.9.1 [futures.task.members]/p9)를 포기합니다. 즉, 공유 상태가 준비되지 않은 경우 broken_promise의 오류 조건을 가진 future_error 유형의 예외 객체를 저장 한 다음 공유 상태 준비된; 공유 된 상태를 해제한다 (§30.6.4 [futures.state]/p7).

이것은 Visual Studio의 차기 버전에서 will be fixedknown bug입니다.이 버전은 2015 년에 출시 될 예정입니다. CTP에서도 수정되었지만 프로덕션 코드로 사용하는 것은 매우 나쁜 생각입니다.

+0

링크를 올바르게 읽었습니까? VS 2013에서 수정되지 않습니다. –

+0

@ EmilyL. 나는 거의 말할 수 없다. [이 페이지의 FAQ 섹션에있는 Q5] (http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking)에 따르면 -changes-in-vs-2013.aspx), 버그 수정을 거의 뒷받침하지 않습니다. –

+2

위대한, 우리가 구입 한 스튜디오는 겨우 1 살이며 그들은 이미 우리를 꼬집어 남겨두고 있습니다. * 한숨 * 확인해 주셔서 감사합니다. 링크 로이 답변을 수락 내 의심에 최종 확인을 넣어. –

7

나는 버그라고 생각하는데, 표준에서는 ~packaged_task이 공유 상태를 포기한다고합니다. 즉, 아직 준비가되지 않았다면 broken_promise 예외를 저장하고 예상대로 상태를 준비해야한다는 것을 의미합니다.

전체 공개 : 당신의 ideone.com 테스트는 GCC를 사용하고 난 구현 GCC의 <future> 그래서 나는 내가 그 동작이 정확 말할 때 바이어스 ...하지만 난 그게

+0

완전히 동의 함. 버려진'future' (즉,이 경우 리턴 값)는'broken_promise'에 대한 * 상황입니다. – starturtle

관련 문제