Un uso de variables de condición que es un poco más complicado que una simple cola de mensajes, es el de "compartir una cerradura", donde los diferentes hilos están esperando sutilmente diferentes condiciones de la misma naturaleza básica. Por ejemplo, tienes un caché web (muy shonky, simplificado). Cada entrada en la memoria caché tiene tres estados posibles: no presente, IN_PROGRESS, COMPLETE.
getURL:
lock the cache
three cases for the key:
not present:
add it (IN_PROGRESS)
release the lock
fetch the URL
take the lock
update to COMPLETE and store the data
broadcast the condition variable
goto COMPLETE
COMPLETE:
release the lock and return the data
IN_PROGRESS:
while (still IN_PROGRESS):
wait on the condition variable
goto COMPLETE
que tengo en la práctica utiliza el patrón de implementar una variante de la función POSIX pthread_once
sin ninguna ayuda del planificador. La razón por la que no pude usar un semáforo o bloqueo por once_control
, y simplemente hacer la inicialización bajo el bloqueo, es que no se permitió que la función fallara, y el once_control
solo tenía una inicialización trivial. Para el caso, pthread_once
no tiene códigos de error definidos, por lo que su implementación posiblemente falle no deja buenas opciones a su interlocutor ...
Por supuesto, con este patrón, debe tener cuidado con la escala. Cada vez que se completa una inicialización, cada subproceso de espera se activa para tomar el bloqueo. Entonces, cuando diseña el sistema, piensa detenidamente sobre la fragmentación, y luego decide que no se puede molestar en hacer nada para implementarlo realmente hasta que vea problemas de rendimiento probados.
¿Debería ser una wiki comunitaria? – jasonline
Ya que no está buscando una respuesta específica y simplemente más "respuestas" generales, probablemente. Pero estoy más cerca de este, es posible que desee esperar el no o el bien de los demás. – GManNickG
+1 Toma esos puntos de reputación bien ganados mientras puedas para esta buena pregunta :-) –