He hecho esto para una tarea sin escribir ningún ensamblador. El mecanismo de cambio de hilo fue setjmp
/longjmp
. Lo que esto implicaba era asignar memoria para la pila de cada hilo, luego masajear muy cuidadosamente los valores en el jmp_buff
para que la ejecución salte a la pila del siguiente hilo.
Ver también Russ Cox bastante legible libtask.
Edite en respuesta al comentario de OP: Al decidir cuándo cambiar los hilos hay dos direcciones principales: preventiva & cooperativa. En el modelo preventivo, tendrá algo así como una señal de temporizador que hace que el flujo de ejecución salte a un hilo de despachador central, que elige el siguiente hilo para ejecutar. En un modelo cooperativo, los subprocesos "ceden" mutuamente, explícitamente (, por ejemplo,, llamando a una función yield()
que proporcionará) o implícitamente (, por ejemplo,, solicitando un bloqueo retenido por otro subproceso).
Eche un vistazo a la API de libtask para ver un ejemplo del modelo cooperativo, particularmente la descripción de la función taskyield()
. Ese es el rendimiento explícito que mencioné. También existen las funciones de E/S sin bloqueo que incluyen un rendimiento implícito: la "tarea" actual se pone en espera hasta que se completa la E/S, pero las otras tareas tienen la oportunidad de ejecutarse.
La asignación es un poco difícil de cumplir porque no se puede hacer "en C". Necesita al menos una cantidad mínima de ensamblados o extensiones de compilador equivalentes para facilitar la creación de nuevos contextos de ejecución y el cambio entre ellos. O podría escribir su propia máquina virtual completa e implementación C para ejecutar en la máquina virtual, pero no creo que esto sea lo que su instructor tenía en mente ... –
Para la multitarea/subprocesamiento cooperativo, puede encontrar getcontext/makecontext/setcontext funciones útiles. – MetallicPriest
No puedo ver cómo podría hacerse esto sin algún ensamblador para implementar el guardado/restauración del contexto de registro y el puntero de la pila. Eso sin siquiera considerar la E/S y cómo esperarla. –