C++11 표준 라이브러리를 이용하여 비동기 작업을 처리하는데 몇 가지 문제가 있다.
  • 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-대기하는-비동기-스레드-작업-구현)
2014/09/03 19:41 2014/09/03 19:41

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요


1 ... 2 3 4 5 6 7 8 9 10 ... 205