2016-07-01 1 views
1

몇 가지 즉각적인 작업 (재 할당)을 수행하고 일부 배경 작업 (오래된 데이터 이동)을 수행해야하는 기능이 있습니다.이 작업을 수행 할 수 있습니까? async를 사용하여 스레드를 제거하고 미래의 범위를 벗어나는 것이 안전합니까?

auto fof = std::async(std::launch::async, &cont2::move_data, this, old_data, old_size); 

가 잘 동작하는 것 같지만 그것은 나를 표준을 사용 : 일반적으로 비동기 일없이 반환 값을 보관 유지하자 대신 동일한 스레드에서 작업을 수행하려고하지 않을 때부터 의심 해요.

답변

2

반환 값, std::future이 범위를 벗어나면 소멸자는 비동기 작업이 완료 될 때까지 스레드의 실행을 중지합니다.

즉, 결과를 반환하지 않으면 동 기적으로 작동합니다. std::async에 대한 호출은 즉시 호출 된 소멸자를 가지며 작업이 완료 될 때까지 차단할 임시를 반환합니다. 마찬가지로 값을 값에 바인딩하면 작업을 계속하지만 바인딩 된 값이 해당 범위의 끝에 도달하면 일시 중지됩니다. 예를 들어

:

{ 
    // bind to a value 
    auto fof = std::async(std::launch_async, 
          &cont2::move_data, this, old_data, old_size); 
    // do work 
} // at this point, execution will halt until cont2::move_data finishes 

http://en.cppreference.com/w/cpp/thread/async를 참조하십시오.

+0

이 동작은'future' 객체에 대해 비정상임을 유의하십시오. 'async'에 의해 반환 된'future's에만 적용됩니다. 왜냐하면 하나님은 C++을 이해하지 못하기 때문입니다 ... –

관련 문제