2012-02-13 11 views
9

En entornos unix, la familia de funciones makecontext()/swapcontext() a veces se usa para implementar corutinas en C. Sin embargo, estas funciones manipulan directamente la pila y el flujo de ejecución. A menudo, cuando estas funcionalidades de bajo nivel son bastante diferentes cuando se cambia de C a C++.Son las funciones makecontext()/swapcontext() compatibles con C++

Así que la pregunta es, si habría algún problema con la implementación de corutinas usando makecontext() y swapcontext(). Por supuesto, uno obviamente debería tener muy buen cuidado, que una excepción nunca podría escapar de una corutina de este tipo, ya que no habría ningún controlador de excepción en la pila para esto y el programa probablemente segmentaría. Pero aparte de eso ¿hay alguna incompatibilidad entre la forma en que C++ maneja las cosas internamente y makecontext() y setcontext() modificar la ruta de ejecución?

+0

Nunca había oído hablar de estas funciones. ¿Sabía que [POSIX 2001] (http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html) ya los marcó obsoletos en favor de los hilos? –

+6

@larsmans: Una pena. Las cosas que son fáciles con corutinas son mucho más difíciles con los hilos. Sí, * puedes * emular corutinas con hilos, pero solo con sobrecarga (¡sincronización!), Y cuando solo se está ejecutando un hilo en cualquier momento con todos los demás bloqueados, en realidad no es para lo que está pensado el enhebrado. – celtschk

Respuesta

6

He utilizado makecontext()/swapcontext() con código C++ antes, y como dices, lo principal a tener en cuenta son las excepciones. Más allá de eso, no he tenido ningún problema. A pesar de su obsolescencia según el estándar, todavía están bien respaldados por sistemas operativos tipo Unix. (hay una advertencia para Mac OS X: tienes que #define _XOPEN_SOURCE antes de #including los encabezados relevantes). La razón fundamental para hacer que se vuelvan obsoletos también es bastante cojo: podrían haberlos reemplazado por una versión similar a pthreads, donde el puntero de función toma un único argumento nulo *.

Como dices, los hilos no son un sustituto útil, así que seguiría adelante y usar swapcontext(). También puede encontrar this blog post interesante para rodar su propia versión de las funciones.

+0

Publicación interesante (aunque creo que el mejor uso de las corutinas probablemente no sea por cortes finos o instancias efímeras, por lo que los gastos generales mencionados pueden ser el peor de los casos). De todos modos, solo para agregar que evito arrojar excepciones y de lo contrario no tengo problemas para usar make/swapcontext (y lo mismo ocurre con las fibras de Windows) en un [proyecto C++] (http://code.google.com/p/crag/source/browse/ src/smp/FiberPosix.cpp). –

Cuestiones relacionadas