2014-09-12 2 views
30

누구도 각자의 사용법에 대해 높은 수준의 직감을 줄 수 있습니까?std :: async vs std :: threads를 사용하는 경우는?

참고 :

+0

문제에 적용하는 방법을 알고있는 것을 사용하십시오. 어떤 문제는 다른 것과 더 잘 어울립니다. 그리고 이것은 자연스럽게 당신의 사고에 반영 될 것입니다. –

+0

하지만 이것들은 동일합니까? 난 그렇게 생각하지 않아. std :: async는 삶을 편하게 만들거나 이전 C++ 문제를 해결하기 위해서만 만들어 졌습니까? –

+2

g ++를 사용하는 경우 재미있는 독서 ('std :: async'에 관한 것) : [async (f)는 없습니다.] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51617) 또한 [이] (http://stackoverflow.com/questions/17963172/why-using-stdasync-from-c11) – streppel

답변

28

그것은 아니에요 정말 중 하나 또는 일 - 당신이 수동으로 만든 표준과 (함께 약속에) 미래를 사용할 수 있습니다 :: 스레드 . std::async을 사용하면 일부 비동기 계산을 위해 스레드를 시작하여 미래를 통해 결과를 마샬링하는 편리한 방법이지만 std::async은 현재 표준에서 다소 제한적입니다. 제안 된 확장이 Microsoft의 PPL 아이디어 중 일부를 채택 할 경우 더 유용 할 것입니다.

현재, std::async은 상당히 간단한 프로그램의 경우 매우 오랫동안 실행되는 계산 또는 장시간 실행되는 IO를 처리하는 데 가장 적합합니다. 낮은 오버 헤드를 보장하지는 않습니다 (실제로 스레드 풀을 사용하여 스레드 풀을 사용하여 구현하기가 어렵습니다). 따라서 세분화 된 작업 부하에 적합하지 않습니다. 이를 위해서는 std::thread을 사용하여 자체 스레드 풀을 롤하거나 Microsoft의 PPL 또는 Intel TBB와 같은 것을 사용해야합니다.

더욱 현대적이며 이식성이 뛰어난 '전통적인'POSIX 스레드 스타일 코드에 std::thread을 사용할 수도 있습니다.

바르 토스 Milewski는 방법 std::async의 한계 일부 현재 그의 기사에 지정된 설명 Async Tasks in C++11: Not Quite There Yet

+0

따라서 효율적인 코드 (또는 스레드를 자주 작성하고 조인하는 경우)를 작성하려면 고전적인 실을 고수하는 편이 낫다. –

+2

자주 쓰레드를 만들고 자주 가입하는 것이 효율적인 코드를 피하고 싶습니다. 이것이 바로 std :: async의 문제입니다. 스레드 풀이 아닌 새 스레드를 실행함으로써 구현 될 가능성이 큽니다. 효율적인 세분화 된 스레드 작업 부하가 필요한 경우 일반적으로 스레드 풀과 같은 것을 원합니다. – mattnewport

+1

@mattnewport : 사실, ['std :: async'는 대개 스레드 풀을 사용합니다.] (http://stackoverflow.com/questions/15666443/which-stdasync-implementations-use-thread-pools). 그러나 반드시 그렇게 할 필요는 없습니다. –

4

한 당신이 방법은 비동기 여부 (폴링을 통해) 감지 할 때 내가 찾은 간단한 이유는 경우입니다 일이 끝났어. std::thread으로 직접 관리해야합니다. std::async을 사용하면 std::future::valid() (또는 std::future::wait_for/wait_until(...))을 쿼리하여 완료 시점을 알 수 있습니다.