Depois de executar este programa
std::future<int> f() {
std::cout << "enter f on thread " << std::this_thread::get_id() << std::endl;
co_return 1;
}
std::future<void> g() {
std::future<int> i = co_await std::async(f);
std::cout << "resume g on thread: " << std::this_thread::get_id() << std::endl;
co_return;
}
int main() {
std::future<void> f;
while (true) {
f = g();
std::this_thread::sleep_for(1s);
}
return 0;
}
que foi compilado com MSVC 19.43 usando a /await
opção, observei que a função f
está sempre sendo executada na mesma thread, enquanto a continuação na função g
é sempre executada em uma thread recém-criada. Também tentei chamar std::async
com std::launch::async
a opção para forçar a criação de uma nova thread, mas ainda assim a mesma thread seria usada para executar f
. Alguém pode explicar o porquê?
std::future
não deveria ter um tipo de promessa em corrotinas C++20, mas isso é uma extensão do MSVC.std::async(f);
executa a funçãof
em outro thread, todas as implementações principais usam um thread-pool para std::async , citando cppref.você obteria o mesmo ID de thread com uma função normal, isso não tem nada a ver com corrotinas. você poderia obter uma de N threads no pool, geralmente N é o número de núcleos, parece que o pool MSVC usa a mesma thread sempre que não está ocupado.
sim, a implementação do MSVC do
std::future
awaiter cria um novo thread para executar a continuação toda vez, o código a seguir é da biblioteca padrão do MSVC.um thread é lançado e destacado, que está esperando para executar a continuação, isso acontece quando se aguarda um
std::future
para resumir o que está acontecendo:
g
, a primeira parte ég
executada no thread principal até o await.std::async(f)
é executadof
no threadpool.await future
lança um novo tópico sobrewait
o futuro e depois executa a continuação deg