Pregunta

Delphi Docwiki explica que Legumbres Notifica el siguiente hilo en la cola de espera que podrá bloquear el objeto especificado tan pronto como el hilo de llamada libera el objeto. Pulsina señala todos los hilos en la cola de espera.

yo fundar Este código que usa pulso en una implementación de cola roscada, y dada la definición anterior, piense que se debe usar pulseall, o preguntarse de una manera diferente: ¿cuándo es correcto usar pulso en lugar de pulseall? (Donde la pregunta básica es: ¿Cómo puedo estar seguro de que el 'siguiente hilo en la cola' es Alyways el hilo que necesita ser notificado, excepto en los casos triviales en los que solo hay dos hilos en total, o el código puede ser de manera segura ¿Suponga que el único hilo de espera es el hilo que no necesita ser nofificado/'pulsado')?

function TSimpleThreadedQueue.Enqueue(const Item: T; Timeout: LongWord): TWaitResult;
begin
  if Closed then Exit(wrAbandoned);
  if not TMonitor.Enter(FQueue, Timeout) then Exit(wrTimeout);
  try
    if Closed then Exit(wrAbandoned);
    FQueue.Enqueue(Item);
    TMonitor.Pulse(FQueue);
    Result := wrSignaled;
  finally
    TMonitor.Exit(FQueue);
  end;
end;

Para los métodos de sincronización correspondientes en el lenguaje Java, encontré esta pregunta: Java: notificar () vs. notifyall () de nuevo


ACTUALIZACIÓN: La pregunta de Java vinculada anteriormente tiene una respuesta interesante que muestra cómo puede ocurrir un punto muerto incluso en una aplicación de productor/consumidor que solo tiene dos métodos, put and get, y que usa notificar () (la contraparte de Java de pulso ()) : Java: notificar () vs. notifyall () de nuevo

La respuesta contiene la recomendación

Si no está seguro de cuál usar, use notifyAll.

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top