La forma "correcta" de codificar un productor/consumidor es hacer que el consumidor espere los datos del productor. Puede lograr esto utilizando un objeto de sincronización como un Mutex. El consumidor va a Wait
en el mutex, lo que bloquea su ejecución hasta que los datos estén disponibles. A su vez, el productor señalará el mutex cuando los datos estén disponibles, lo que activará el hilo del consumidor para que pueda comenzar a procesarse. Esto es más eficiente que sleep
tanto en términos de:
- utilización de la CPU (no hay ciclos se desperdician), y
- tiempo de ejecución (ejecución comienza tan pronto como se dispone de datos, no cuando está prevista una rosca para despertar arriba).
Dicho esto, he aquí un análisis de rendimiento vs sueño que usted solicitó. Es posible que necesite utilizar dicho esquema si por algún motivo esperar la salida no es factible:
Depende de la cantidad de tráfico que recibe; si los datos se reciben y procesan constantemente, podría considerar realizar un rendimiento. Sin embargo, en la mayoría de los casos esto dará como resultado un ciclo "ocupado" que pasa la mayor parte del tiempo inútilmente despertando el hilo para verificar si algo está listo.
Es probable que desee dormir por un corto período de tiempo (quizás por menos de un segundo, usando usleep
) O incluso mejor utilizar un objeto de sincronización como un mutex para indicar que los datos están disponibles.
Ninguno, usted quiere que bloquee. Google "buffer limitado". –