2014-01-19 2 views
0

나는 다음과 같은 C++ 11 코드가 있습니다std :: future timeouts가 너무 일찍 발생 했습니까?

내 노트북에
auto f = std::async(std::launch::async, []() { myfunction(); }); 
std::future_status status; 
do { 
    status = f.wait_for(std::chrono::seconds(1)); 
    if (status == std::future_status::timeout) { 
     fprintf(stderr, "Hello!\n"); 
    } 
} while (status != std::future_status::ready); 

이 매 초마다 myfunction() 실행을위한 즉 미세 (GCC 버전 4.7.3 (우분투/리나 4.7.3-1ubuntu1을)), 실행을 I "안녕하세요!" 산출. GCC 버전 내 ARM 보드 그러나

4.7.3 20130328 (시험판) (crosstool-NG 리나 - 1.13.1-4.7-2013.04-20130415 - 리나 GCC 2013.04) 지금 당장하고 상당한 지연없이 출력을 얻을 (즉, 첫 번째 초도 기다리지 않습니다.) 또한 "Hello!"인쇄를 계속합니다. myfunction()까지 완료됩니다.

http://en.cppreference.com/w/cpp/thread/future/wait_for에 따르면 제한 시간이 만료 된 경우에만 시간 초과 상태를 가져야합니다.

GCC ("C++ 11 future_status::deferred not working"참조)에서 "Timed waiting functions가 future_status :: deferred를 반환하지 않습니다"라고 생각됩니다. 그러나 myfunction()가 실행되므로 결국 항상 "시간 초과"를 반환해서는 안됩니다. 그렇지 않습니까?

ARM 플랫폼에서 future :: wait_for에 대한 경험이있는 사람이 있습니까? 아니면 누구든지이 문제에 대해 알려줄 수 있습니까?

+4

내 경험에 의하면 일부 stdlibC++는 x86에서 4.7에 완전히 업데이트되지 않았지만 ARM에서는 훨씬 더 좋지 않다고 생각합니다. 당신은 boost :: future를 시도 했습니까? 아마도 당신은 * std :: future 타임 아웃을 너무 일찍 사용하고 있습니다. – user3125280

+0

아니요, 아직 없습니다. 외부 라이브러리의 사용을 제한하려고합니다. 표준 라이브러리에 구현이 있거나 존재해야합니다. – Frankie

+0

표준 라이브러리는 단지 부스트 포트 일뿐입니다. C++ 11 버전이 시스템에서 작동하지 않는 경우 부스트가 발생할 수 있습니다. 그들이 어떤 상태로 돌아오고 있습니까? – user3125280

답변

0

(Ubuntu Raring에서 Ubuntu Saucy로) 보드의 이미지를 업데이트했으며 코드가 올바르게 작동합니다. @ user3125280이 지적했듯이 이것은 사실 stdlibC++ 문제였습니다.

관련 문제