2011-12-19 10 views
8

¿Hay alguna manera de que pueda tener coroutines seguras para hilos junto con boost :: asio?Thread coroutines seguras con asio

Quiero que uno io_service se ejecute en varios subprocesos y que algunos de mis controladores sean correcciones.

Boost.Coroutine parece ser una solución, pero document que no son compatibles con la reanudación de una corutina que se inició en un hilo separado.

Por lo que yo sé que sólo hay dos posibles soluciones a este problema:

  1. no utilice corrutinas. Utilice el método mucho más detallado (incluso con lambda), pero igualmente funcional de encadenamiento de devoluciones de llamadas que almacenan el estado.
  2. Fuerza a cada controlador para que solo se ejecute en un subproceso. Sé que esto es posible simplemente teniendo un io_servicio separado para cada hilo. Como un aparte, ¿hay una manera fácil, similar a io_service :: strand, de forzar a un conjunto de manejadores a ejecutarse en el mismo hilo?

Ninguna de las dos es una buena solución. En una solución, pierdo corotines. En el otro, pierdo la mayor parte de mi capacidad de subprocesamiento múltiple.

+1

FYI: ¿Has visto http://blog.think-async.com/2009/08/secret-sauce-revealed.html y http://blog.think-async.com/2010/03/potted- guide-to-stackless-coroutines.html? – Ralf

+0

@Ralf Sí, lo he visto, y por eso estoy haciendo esta pregunta. Parece una idea genial y una forma más fácil de escribir código asíncrono. – Lalaland

Respuesta

3

Parece que este problema no tiene una solución fácil.

El principal problema de fallo probablemente se deba al hecho de que C++ permite a los compiladores reordenar la mayor parte de lo que sucede en una función. Por lo tanto, no puede depender de manera confiable del orden de las cosas que suceden en las funciones.

Parece que tendré que terminar usando una serie de devoluciones de llamada, posiblemente usando lambda si tengo el deseo de mantener todo semánticamente como un bloque de código.

Tal vez incluso pueda piratear algo utilizando macros que se resuelven en lambdas para simular el estilo coroutine.

+0

Para su información, las devoluciones de llamadas son un excelente conductor para las coroutines si hay una biblioteca de coroutines que ejecuta el resto de una coroutine desde dentro de la devolución de llamada (https://code.google.com/p/libglim/source/browse/trunk/test_cbcoro .cc). – ArtemGr