67 votes

Comment implémenter Coroutines en C ++

Je doute que cela puisse être fait de manière portable, mais y a-t-il des solutions? Je pense que cela pourrait être fait en créant une pile alternative, en réinitialisant SP, BP et IP lors de la saisie de la fonction, et en obtenant une sauvegarde de sauvegarde IP et une restauration de SP + BP. Les destructeurs et la sécurité des exceptions semblent difficiles mais résolus.

At-il été fait? Est-ce impossible?

94voto

witkamp Points 2272

Oui, il peut être fait avec un problème. Tous vous avez besoin est un peu d'asm pour déplacer la pile des appels pour un nouvellement allouée pile sur le tas.

Je voudrais regarder le boost::coroutine de la bibliothèque.

La seule chose que vous devriez regarder dehors pour est un débordement de pile. Sur la plupart des systèmes d'exploitation débordement de la pile va provoquer une ERREUR de segmentation parce que la page de mémoire virtuelle n'est pas tracé. Toutefois, si vous allouer de la pile sur le tas vous n'obtenez pas de garantie. Il suffit de garder cela à l'esprit.

18voto

zvrba Points 14028

Sur POSIX, vous pouvez utiliser les routines makecontext () / swapcontext () pour basculer de manière portable les contextes d’exécution. Sous Windows, vous pouvez utiliser l'API fibre. Sinon, vous avez besoin d’un peu de code d’assemblage qui change le contexte de la machine. J'ai implémenté des coroutines à la fois avec ASM (pour AMD64) et avec swapcontext (); ni est très difficile.

15voto

tgoodhart Points 1206

Pour la postérité,

Le formidable site Web de Dmitry Vyukov présente une astuce astucieuse en utilisant ucontext et setjump pour simuler des coroutines en c ++.

De plus, la bibliothèque de contexte d'Oliver Kowalke a récemment été acceptée dans Boost. Nous espérons donc voir une version mise à jour de boost.coroutine qui fonctionnera bientôt sur x86_64.

11voto

Eonil Points 19404

Il n'y a pas de moyen facile à mettre en œuvre coroutine. Parce que coroutine lui-même est hors de C/C++de la pile de l'abstraction comme fil. Il ne peut donc pas être pris en charge sans langue niveau des changements d'appui.

Actuellement(C++11), tous les C++ coroutine implémentations sont tous basés sur le niveau de l'assemblée de piratage est difficile d'être sûr et fiable. Pour être fiable, il doit être la norme, et géré par la plate-forme spécifique compilateurs plutôt que de piratage.

Il y a une proposition de standard - N3708 pour cela. Check it out si vous êtes intéressé.

5voto

yrp Points 2931

Je ne pense pas qu'il existe de nombreuses implémentations complètes et propres en C ++. Un essai que j'aime bien est la bibliothèque de protothread .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X