Creé una aplicación de subprocesos múltiples utilizando subprocesos C++ y POSIX. En el que ahora debería bloquear un hilo (hilo principal) hasta que se establezca un indicador booleano (se vuelva verdadero).
He encontrado dos maneras de hacer esto.
Girando a través de un bucle sin dormir.
while(!flag);Girando a través de un bucle con el sueño.
while(!flag){ sleep(some_int); }Si debo seguir la primera forma, ¿por qué algunas personas escriben códigos siguiendo la segunda forma? Si se debe usar la segunda forma, ¿por qué debemos hacer que el hilo actual duerma? ¿Y cuáles son las desventajas de esta manera?
La primera opción (una "espera ocupada") desperdicia un núcleo completo durante la espera, evitando que se realice otro trabajo útil y/o desperdiciando energía.
La segunda opción es menos derrochadora: su subproceso en espera usa muy poca CPU y permite que se ejecuten otros subprocesos. Pero sigue siendo un desperdicio volver al hilo para verificar la bandera.
Mucho mejor que cualquiera de los dos sería usar una variable de condición, que permite que el subproceso en espera se bloquee sin consumir ningún recurso hasta que pueda continuar.
while(flag); hará que su subproceso use todo el tiempo asignado para verificar la condición. Esto desperdicia muchos ciclos de CPU comprobando algo que probablemente no ha cambiado.
Dormir un poco hace que el subproceso se detenga y ceda la CPU a los programas que realmente la necesitan.
Sin embargo, tampoco deberías hacerlo; debe usar una biblioteca de subprocesos para crear un objeto de indicador y llamar a su función de wait , de modo que el núcleo pause el subproceso hasta que se establezca el indicador.
La primera forma (simplemente while ) es desperdiciar recursos, específicamente el tiempo de procesador de su proceso.
Cuando un subproceso se pone en sleep , el sistema operativo puede decidir que el procesador se utilizará para diferentes tareas cuando se habla de sistemas con multitarea preventiva. En teoría, si tuviera tantos procesadores/núcleos como hilos, no tendría por qué haber ninguna diferencia.
Si una solución es buena o no, depende del sistema operativo utilizado y, a veces, de la arquitectura en la que se ejecuta el programa. Debe consultar su referencia de syscall para obtener más información al respecto.