La pregunta: ¿Es posible garantizar que la ejecución de código solo puede ocurrir en un subproceso a la vez en un programa multiproceso? (O algo que se aproxima a esto)Ejecución de código serie en un programa multiproceso en C++
Específicamente: Tengo un controlador M (que es un hilo) y los hilos A, B, C. Me gustaría que M pueda decidir a quién se le debe permitir ejecutar. Cuando el hilo ha finalizado (ya sea finalmente o temporalmente) el control se transfiere a M.
Por qué: Lo ideal es que A, B y C ejecuten su código en su propio subproceso mientras que los otros no se están ejecutando. Esto permitiría que cada subproceso mantuviera su puntero de instrucción y la pila mientras se pausan, comenzando desde donde lo dejaron cuando el controlador les devuelve el control.
Lo que estoy haciendo ahora: He escrito un código que realmente puede hacer esto, pero no me gusta.
En pseudo-C:
//Controller M
//do some stuff
UnlockMutex(mutex);
do{}while(lockval==0);
LockMutex(mutex);
//continue with other stuff
//Thread A
//The controller currently has the mutex - will release it at UnlockMutex
LockMutex(mutex);
lockval=1;
//do stuff
UnlockMutex(mutex);
La razón por qué se requiere
do{}while(lockval==0);
es que cuando se desbloquea el mutex, ambos A y M continuarán. Este truco asegura que A no desbloqueará el mutex antes de que M pueda volver a bloquearlo, lo que permite a A retomar el bloqueo por segunda vez y ejecutarlo nuevamente (solo debería ejecutarse una vez).
El do-while parece exagerado, pero cumple su función. Entonces mi pregunta es, ¿hay una mejor manera?
¿Por qué no desea que los subprocesos A, B y C se ejecuten al mismo tiempo? ¿Cuál es el problema que estás tratando de resolver? Es casi seguro que hay una forma mejor de resolver el problema, pero debe decirnos cuál es el problema * *. –
Esta parte me confunde: "Esto permitiría que cada subproceso mantenga su puntero de instrucción y la pila mientras hacen una pausa". Ese no es el propósito de los mutexes.El sistema operativo (asumiendo el modelo de subproceso preventivo) mantiene la pila de cada subproceso y se registra a medida que les da tiempo de CPU. – veefu
@veefu - OP quiere 'hilos verdes', fibras AKA, (creo). A, B y C todos obtienen su propia pila, pero solo uno puede ejecutarse a la vez porque solo hay un hilo del kernel. –