2009-09-22 13 views

Respuesta

64

Joe Duffy's "Concurrent Programming On Windows" menciona esto (P311-312, P598). Este bit es interesante:

Nótese que en todos los ejemplos anteriores, las discusiones deben ser resistentes a algo que se llama espuria despertares

- código que utiliza variables de condición deben permanecer correcta y animado incluso en los casos en que se despierta prematuramente , es decir, antes de que se haya establecido la condición que se busca. Esto no se debe a que la implementación realmente hará tales cosas (aunque se sabe que algunas implementaciones en otras plataformas como Java y Pthreads lo hacen), ni porque el código activará los hilos intencionalmente cuando es innecesario, sino más bien porque no existe garantía en torno a cuándo se programará un hilo que se ha despertado. Las variables de condición no son justas. Es posible, e incluso probable, que otro hilo adquiera el bloqueo asociado y vuelva a falsear la condición antes de que el hilo despierto tenga la posibilidad de volver a adquirir el bloqueo y regresar a la región crítica.

A continuación, muestra el patrón normal durante un rato, comprobando la condición.

Yo diría que a partir de esto, es razonable esperar que Monitor.Waitvoluntad no normalmente se despierta antes de tiempo, y que si es absolutamente sabe que nada más puede haber cambiado la condición entonces podría poder salirse sin el ciclo de condición: pero que es más seguro incluirlo de todos modos, en caso de que tu lógica sea inexacta.

+0

Muy buena explicación de despertar espurios. ¡Gracias! – Gili

+0

Estoy consultando con Joe directamente para ver si mi extrapolación es correcta. –

+0

¿Joe te respondió eso? En la página 207 del mismo libro, él indica que el CLR usa una rutina de espera común (alertable) cada vez que usted bloquea, incluyendo el bloqueo de llamadas a Monitor. ¿Esto implicaría que, además de los "aparentes" despertares espurios que mencionas, tu Espera también podría estar sujeta a una activación supirous "genuina" causada por una Llamada a Procedimiento Asíncrono? –