Ich verwende Visual Studio 2012 und versuche zu lernen, wie std :: async funktioniert. Ich habe eine sehr einfache C++ Konsolenanwendung erstellt:std :: launch :: async blockiert wie ein Synchronisierungsprozess
#include "stdafx.h"
#include <future>
#include <iostream>
void foo() {
std::cout << "foo() thread sleep" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
std::cout << "foo() thread awake" << std::endl;
}
int main()
{
std::future<void> res = std::async(std::launch::async, foo);
res.get();
std::cout << "MAIN THREAD" << std::endl;
system("pause");
return 0;
}
Meine anfängliche Erwartung war, „Haupt-Thread“ Ausdruck erscheint vor „foo() Thread wach“, um zu sehen, da die beiden Threads asynchron ausgeführt werden, mit dem foo() aufgrund seines Schlafverhaltens hinterherhinken. Dies ist jedoch nicht das, was tatsächlich passiert. Der Aufruf von res.get() blockiert, bis foo() aufwacht, und erst dann kommt der Ausdruck "MAIN THREAD". Dies ist bezeichnend für ein synchrones Verhalten, also frage ich mich, was passiert, wenn ich vielleicht etwas vermisse oder die Implementierung nicht vollständig verstehe. Ich habe zahlreiche Beiträge zu diesem Thema durchgesehen, kann aber immer noch keinen Sinn daraus machen. Jede Hilfe wäre willkommen!
Was denkst du ['future :: get'] (http://en.cppreference.com/w/cpp/thread/future/get)? –
Der Aufruf von 'get()' auf einer 'std :: future <>' Instanz blockiert den Thread, bis Sie das Ergebnis erhalten. http://en.cppreference.com/w/cpp/thread/future/get – user2296177
dann wie unterscheidet sich das als Aufruf der Funktion foo() direkt? – boondocks