비동기: boost async & boost future
3234 단어 c/c++
보충, 여기 보기:http://blog.csdn.net/gw569453350game/article/details/50435879
#include
using namespace boost;
int main()
{
future<int> f1 = async([]() { return 123; }); // or any heavy computation
future<string> f2 = f1.then([](future<int> f) { return f.get().to_string(); // here .get() won't block;
}
위의 코드 는
f1
변 수 를 저장 해 야 합 니 다. 그렇지 않 으 면 async
임시 future
변 수 를 되 돌려 주 고 삭 제 됩 니 다. 이 future
의 삭 제 는 메 인 프로그램 이 비동기 로 실 행 된 함수 의 반환 (즉 차단) 을 기다 리 게 할 것 입 니 다.따라서 async 가 실행 하 는 함수 의 반환 값 을 사용 하지 않 아 도 f1 로 되 돌아 오 는 future 변 수 를 저장 해 야 합 니 다. 그렇지 않 으 면 비동기 실행 을 막 을 수 있 습 니 다 (즉, async 는 계산 이 끝 난 후에 만 돌아 올 수 있 습 니 다). 예 를 들 어:void f()
{
std::future fut = std::async(std::launch::async,
[] { /* compute, compute, compute */ });
} // block here until thread spawned by std::async completes
The function blocks until the asychronously running thread completes.
왜냐하면:
The thread completion [for the function run asynchronously] synchronizes with [i.e., occurs before] [1] the return from the first function that successfully detects the ready status of the shared state or [2] with the return from the last function that releases the shared state, whichever happens first.
그러나 async 를 사용 하지 않 으 면 차단 되 지 않 습 니 다.
void f3()
{
std::packaged_task pt(doSomeWork);
auto fut = pt.get_future();
std::thread(std::move(pt)).detach();
... // no get, no wait
}
Now what happens?
Your function returns, even if the function to be run asynchronously is still running.
주의: boost:: future 는 한 번 만 얻 을 수 있 습 니 다. 두 번 째 get 은 비어 있 습 니 다!
링크 참조 1.http://www.boost.org/doc/libs/1_59_0/doc/html/thread/synchronization.html#thread.synchronization.futures 2. http://scottmeyers.blogspot.hk/2013/03/stdfutures-from-stdasync-arent-special.html 3. http://scottmeyers.blogspot.hk/2013/03/thread-handle-destruction-and.html 4. http://www.boost.org/doc/libs/1_59_0/doc/html/thread/build.html#thread.build.configuration.future