El primero no está bien:
Los pthread_cond_timedwait()
y pthread_cond_wait()
funciones serán bloque de una condición variable. Ellos serán llamados con mutex bloqueado por el subproceso de llamada o no definido resultados de comportamiento.
http://opengroup.org/onlinepubs/009695399/functions/pthread_cond_timedwait.html
La razón es que la aplicación puede querer depender de la exclusión mutua estar encerrado con el fin de agregar con seguridad a una lista camarero. Y es posible que desee liberar el mutex sin verificar primero que esté retenido.
El segundo es inquietante:
si se requiere comportamientos de programación predecible , a continuación, que mutex está bloqueado por el subproceso de llamada pthread_cond_signal()
o pthread_cond_broadcast()
.
http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_cond_signal.html
De la parte superior de mi cabeza, no estoy seguro de lo que la condición de carrera específica es que meta la pata comportamiento del programador si la señal sin tomar la cerradura. Así que no sé qué tan malo puede ser el comportamiento indefinido del programador: por ejemplo, tal vez con la transmisión, los camareros simplemente no obtienen el bloqueo en orden de prioridad (o sin embargo, su programador particular normalmente se comporta). O tal vez los camareros pueden "perderse".
general, sin embargo, con una condición variable que desea establecer la condición (al menos una bandera) y la señal, en lugar de sólo la señal, y por ello, tiene que tomar la exclusión mutua. La razón es que, de lo contrario, si estás concurrente con otro hilo que llama a wait(), entonces obtienes un comportamiento completamente diferente en función de si wait() o signal() gana: si la señal() se cuela primero, entonces podrás espere el tiempo de espera completo aunque la señal que le importa ya haya sucedido. Rara vez es lo que quieren los usuarios de las variables de condición, pero puede estar bien para ti. Tal vez esto es lo que los documentos significan con "comportamiento impredecible del planificador": de repente, el tiempo se vuelve crítico para el comportamiento de su programa.
Por cierto, en Java que tiene que tener la cerradura con el fin de notificar() o notifyAll():
Este método sólo debe ser llamado por un hilo que es el propietario del monitor de este del objeto .
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#notify()
El Java sincronizado {/}/wait/notifty/notifyAll comportamiento es análogo al pthread_mutex_lock/pthread_mutex_unlock/pthread_cond_wait/pthread_cond_signal/pthread_cond_broadcast, y no por casualidad.
para que quede claro, lo que quiere es esperar hasta N segundos, a menos que se despierte temprano? –
sí solo eso. Probablemente los semáforos son un mejor trato. –