2012-03-16 2 views
17

std::async의 동작에 대한 질문이 std::launch::async 정책 & std::future async에서 반환되었습니다.std :: async with asp :: launch :: async policy의 동작

다음 코드에서 메인 스레드는 async 호출에 의해 생성 된 스레드에서 foo()의 완료를 기다립니다.

#include <thread> 
#include <future> 
#include <iostream> 

void foo() 
{ 
    std::cout << "foo:begin" << std::endl; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
    std::cout << "foo:done" << std::endl; 
} 

int main() 
{ 
    std::cout << "main:begin" << std::endl; 
    { 
    auto f = std::async(std::launch::async, foo); 
    // dtor f::~f blocks until completion of foo()... why?? 
    } 
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    std::cout << "main:done" << std::endl; 
} 

내가 http://www.stdthread.co.uk/doc/headers/future/async.html을 알고는

반환 된 표준의 비동기 상태와 관련된 마지막으로 미래 개체의 소멸자를 말한다 :: 미래가 준비 될 때까지 미래가 차단하여야한다.

내 질문은 :

  • Q1. 이 동작은 현재 C++ 표준을 준수합니까?
  • Q2. Q1의 대답이 '예'라면, 그 진술은 무엇이라고 말합니까?
+0

표준에 대해 정말 놀라운 점은 하나의 각주가 챕터를 완전히 변경한다는 것입니다. – orlp

답변

16

예, 이것은 C++ 표준에서 필요합니다. 30.6.8 [futures.async] 제 5 항, 최종 탄 :

- 연관 스레드 완료 성공적 공유 상태 또는 복귀와 함께 준비 상태를 검출하는 기능 제에서 (1.10)을 창에 동기 공유 상태를 해제하는 마지막 함수 중 먼저 일어나는 시점부터 시작됩니다.

오직 하나의 소멸자가 해당 조건을 만족하므로 스레드 완료를 기다려야합니다.

+1

OP 코드는 VS2012에서 동일하게 작동하지 않습니다. 그것은'미래'소멸자를 막지 않습니다. 어떤 종류의 버그일까요, 아니면 마이크로 소프트가 단순히 셔터에서 막지 말라는 Sutter의 제안을 받아 들였을까요? –

+0

Microsoft는 소멸자를 차단하지 않기 위해 Herb Sutter의 제안을 구현하기로 결정했습니다. –

+0

이 문제는 큰 문제이지만 표준을 수정하기에는 너무 늦었습니다. Microsoft는 비표준 동작을 채택하기로 동의하고 있기 때문에 동의하지 않기 때문에 플랫폼 간 개발자에게는 어려움이 있습니다. – cdmh