La Confusion à propos des threads lancés par std::asynchrone avec std::lancement::async paramètre

Je suis un peu confus au sujet de la std::async fonction.

La spécification dit: opération asynchrone été exécuté", comme si dans un nouveau thread d'exécution" (C++11 §30.6.8/11).

Maintenant, qu'est que ça veut dire?

Dans ma compréhension, le code

std::future<double> fut = std::async(std::launch::async, pow2, num);

devrait lancer la fonction pow2 sur un nouveau thread et passer la variable num pour le thread en valeur, puis quelque temps dans l'avenir, lorsque la fonction est terminé, placer le résultat dans fut (aussi longtemps que la fonction pow2 a une signature comme double pow2(double);). Mais la spécification des états "comme si", ce qui rend le truc un peu brumeux pour moi.

La question est:

Est un nouveau thread toujours lancé dans ce cas? Je l'espère. Je veux dire, pour moi, le paramètre std::launch::async de sens que dans une façon que je suis indiquant explicitement j'ai bien envie de créer un nouveau thread.

Et le code

std::future<double> fut = std::async(std::launch::deferred, pow2, num);

devrait faire évaluation différée possible, en retardant le pow2 appel de la fonction au point où j'écris quelque chose comme var = fut.get();. Dans ce cas, le paramètre std::launch::deferred, devrait signifier que je suis indiquant explicitement, je ne veux pas un nouveau fil de discussion, je veux juste m'assurer que la fonction est appelée quand il y a besoin pour sa valeur de retour.

Sont mes hypothèses correctes? Si non, veuillez expliquer.

Aussi, je sais que par défaut, la fonction est appelée comme suit:

std::future<double> fut = std::async(std::launch::deferred | std::launch::async, pow2, num);

Dans ce cas, on m'a dit que si un nouveau fil de discussion sera lancée ou pas dépend de la mise en œuvre. Encore une fois, qu'est ce que ça veut dire?

  • "comme si" signifie qu'il peut théoriquement réutiliser un fil de discussion existant (par exemple, dans un pool de threads) aussi longtemps que le comportement est indiscernable. Dans la pratique, très peu (le cas échéant) de mise en œuvre de cette cause ", comme si un nouveau fil de discussion" vous oblige à détruire et recréer toutes les variables locales de thread.
  • ou à mettre en œuvre (lourd) coroutine-les variables locales. Demandez à chaque fil reçoit un coroutine, et thread_local est coroutine local. Le async pouvez créer une coroutine, que coroutine peut être flac dans un autre thread et de l'exécuter. C'est à dire, imiter le filetage (avec coroutines) sur le dessus d'un OS-prévu modèle de thread?
  • Je garde std::async est cassé, est-ce vrai?
  • Je ne comprends pas pourquoi std::async cours d'exécution dans le nouveau thread devrait surprise vous? c'est ce que l'action asynchrone signifie..
  • action asynchrone ne signifie pas "sur un autre thread". Cela signifie simplement se produit sans être en synchronisation avec une autre action (la synchronisation étant dans ce cas à l'autre lorsqu'une action se termine). Ce qui pourrait signifier sur un autre fil... ou soixante-douze autres choses.
  • Où avez-vous "entendre"? Et de définir la "cassé". Il semble bien pour moi.
  • Je pense que ici, sur un débordement de pile et, éventuellement, dans un article que j'ai de ne pas oublier exactement où exactement quel le bug a été, mais je pense que la personne a indiqué qu'il y avait un problème avec elle, c'est la norme qui a provoqué de ne pas fonctionner correctement et / ou ont un comportement incorrect avec un type de problème.