tipos funciones ejemplos datos comandos codigos caracteristicas basicos c# .net queue multitasking continuations

c# - ejemplos - funciones en c++ pdf



C#primera clase de continuación a través de la interoperabilidad de C++ o de alguna otra manera? (5)

El modo de fibra se eliminó de v2 del CLR debido a problemas bajo tensión, ver:

Hasta donde sé, el soporte de fibra aún no se ha agregado, aunque al leer los artículos anteriores, se puede agregar nuevamente (sin embargo, el hecho de que nada haya mencionado durante 6-7 años sobre el tema me hace creer que es poco probable).

El soporte de fibra FYI estaba destinado a ser una forma de que las aplicaciones existentes que usan fibras (como SQL Server) alojen el CLR de una manera que les permita maximizar el rendimiento, no como un método para permitir que las aplicaciones .Net creen cientos de hilos. en pocas palabras, las fibras no son una solución mágica para su problema ; sin embargo, si tiene una aplicación que utiliza fibras y desea alojar el CLR, las API de alojamiento administradas proporcionan los medios para que el CLR "funcione bien" con su aplicación. Una buena fuente de información sobre esto sería la documentación de API de hospedaje administrado , o para examinar cómo SQL Server aloja el CLR, del cual hay varios artículos altamente informativos a su alrededor.

También lea rápidamente los hilos, las fibras, las pilas y el espacio de direcciones .

Tenemos una aplicación C # muy cercana a la realización de tareas en tiempo real, de muy alto rendimiento. Este rendimiento se logró principalmente mediante la implementación de multitarea cooperativa en la empresa con un planificador de cosecha propia. Esto a menudo se llama microhilos. En este sistema, todas las tareas se comunican con otras tareas a través de colas.

El problema específico que tenemos parece que solo se puede resolver a través de continuaciones de primera clase que C # no admite.

Específicamente, el problema surge en 2 casos relacionados con colas. Cada vez que una tarea en particular realiza algún trabajo antes de colocar un elemento en una cola. ¿Qué pasa si la cola está llena?

Por el contrario, una tarea diferente puede hacer algún trabajo y luego tener que sacar un elemento de una cola. ¿Qué pasa si esa cola está vacía?

Hemos resuelto esto en el 90% de los casos al vincular las colas con las tareas para evitar que se invoquen las tareas si alguna de sus colas de salida está llena o si la cola de entrada está vacía.

Además, ciertas tareas se convirtieron en máquinas de estado para que puedan manejarlas si una cola está llena / vacía y continuar sin esperar.

El problema real surge en algunos casos extremos donde no es práctico hacer cualquiera de esas soluciones. La idea en ese escenario sería guardar el estado de la pila en el punto y cambiar a una tarea diferente para que pueda hacer el trabajo y luego volver a intentar la tarea de espera cada vez que pueda continuar.

En el pasado, intentamos hacer que la llamada a la espera volviera a llamar al cronograma (recursivamente) para permitir que las otras tareas volvieran a intentar la tarea en espera. Sin embargo, eso condujo a demasiadas situaciones de "punto muerto".

Hubo un ejemplo en alguna parte de un host CLR personalizado para hacer que los subprocesos .NET realmente operen como "fibras", lo que esencialmente permite cambiar el estado de pila entre subprocesos. Pero ahora parece que no puedo encontrar ningún código de muestra para eso. Además, parece que tomará una gran complejidad para hacerlo bien.

¿Alguien tiene otras ideas creativas sobre cómo cambiar entre las tareas de manera eficiente y evitar los problemas anteriores?

¿Hay otros hosts CLR que ofrecen esto, comercial o de otro tipo? ¿Hay alguna biblioteca nativa complementaria que pueda ofrecer alguna forma de continuación para C #?


En realidad, decidimos una dirección para ir con esto. Estamos usando el patrón Observer con Message Passsing. Creamos una biblioteca propia para manejar todas las comunicaciones entre "Agentes" que son similares a un proceso de Erlang. Más adelante consideraremos el uso de AppDomains para separar aún más a los Agentes entre sí. Las ideas de diseño se tomaron prestadas del lenguaje de programación Erlang, que tiene un procesamiento multinúcleo y distribuido extremadamente confiable.


Está el CTP C # 5 , que realiza una transformación de estilo de continuación de paso sobre los métodos declarados con la nueva palabra clave async , y las llamadas basadas en el paso de continuación al usar la palabra clave await .

Esta no es realmente una nueva característica de CLR, sino más bien un conjunto de directivas para que el compilador realice la transformación de CPS sobre su código y un puñado de rutinas de biblioteca para manipular y programar las continuidades. Los registros de activación para métodos async se colocan en el montón en lugar de la pila, por lo que no están vinculados a un hilo específico.


La solución a su problema es usar algoritmos sin bloqueo que permitan el progreso de todo el sistema de al menos una tarea. Necesita utilizar un ensamblador en línea que dependa de la CPU para asegurarse de que tiene CAS atómico (compare-y-swap). Wikipedia tiene un article y patrones que describen el book de Douglas Schmidt llamado "Arquitectura de software orientada a patrones, patrones para objetos concurrentes y en red". No me queda claro de inmediato cómo lo hará en el marco de las redes.

Otra forma de resolver su problema es utilizar el patrón publicar-suscriptor o posibles grupos de hilos.

Espero que esto haya sido útil?


No, no voy a trabajar. C # (e incluso IL) es un lenguaje demasiado complejo para realizar tales transformaciones (CPS) de una manera general. Lo mejor que puedes obtener es lo que C # 5 ofrecerá. Dicho esto, es probable que no pueda romper / reanudar con bucles / iteraciones de orden superior, lo cual es realmente lo que quiere de continuaciones de propósito general confirmables.