- VS2012에서 std::async는 프로그램 종료시까지 thread 자원을 release하지 못한다.(LINK)
VS2013에서 해결됨 - std::async는 기본적으로 다른 스레드에서 실행되는 것을 보장하지 않는다.(std::launch::async 필요)
다음과 같은 조건일 때 std::async는 좋지 않은 선택이다.
- 스레드에서 실행하는 것이 보장되어야 할 때
- 나중에 결과를 얻어야 할 때
- 결과값을 얻을 때 스레드가 완전히 소멸 되어야 할 때
이러한 경우에 std::package_task와 std::thread를 std::future와 조합하여 해결할 수 있다.
이 방법은 std::async를 사용해야 할 경우에 대부분 적용 가능하다.
출처 : http://stackoverflow.com/questions/12320003/get-return-code-from-stdthread#include < packaged_task > #include < thread > int myfun(double, char, bool); std::packaged_task< int(double, char, bool) > task(myfun, arg1, arg2, arg3); auto f = task.get_future(); std::thread thread(std::move(task)); thread.detach(); int result = f.get();
- f는 std::future< int >와 같다.
- task는 non copyable이므로 명시적으로 move를 사용해야 한다.
- future로 동기화된 결과를 받기 때문에 detach를 사용한다.
- f.get()에서 결과를 기다린다.
위와 같이 처리할 경우 C++11 표준 라이브러리를 이용하여 비동기 작업을 새로운 스레드에 바로 할당하는 것이 가능하다.
위 내용은 다음 블로그에서 참조하였습니다.
(http://wsstudio.tistory.com/entry/c-대기하는-비동기-스레드-작업-구현)
덧글을 달아 주세요