Interface Lock tiene un parámetro de equidad booleano útil para garantizar la equidad en el bloqueo : el subproceso que espera el bloqueo por más tiempo, obtiene el bloqueo primero . Y pensé que quería usarlo en todas partes, ya que previene el hambre . Bueno, no sin antes leer que nos puede costar rendimiento.
No pude encontrar una respuesta a esta pregunta, así que espero que alguien pueda aclarar esto. Es decir, ¿cuál es la diferencia entre tomar hilos que "honran" la equidad y hilos que no lo hacen? ¿No están ambos almacenados en una cola "ordinaria" donde están otros hilos en espera?
Cuando se libera un bloqueo, y cuando más de un subproceso lo está esperando, el subproceso que ha estado esperando más tiempo es el que tiene más probabilidades de encontrar que las páginas de memoria que va a querer se han intercambiado mientras estaba "dormido". El subproceso que ha estado inactivo durante la menor cantidad de tiempo es el que tiene más probabilidades de estar "listo para funcionar".
Disculpas a @xingbin si eso es lo que intentabas decir.
En primer lugar, no es la interface Lock
la que tiene esa fairness
, sino ReentrantLock
.
Es posible que los subprocesos que emiten Lock::lock
no se pongan en cola, ya sea en modo fair
o unfair
.
El modo unfair
es un poco más fácil de entender. En este modo, el subproceso que solicita el bloqueo (llamando a Lock::lock
), intenta obtenerlo inmediatamente sin ponerse en cola. Si eso tiene éxito, hecho. No se pone en ninguna cola, ya que podría obtener el bloqueo. Tenga en cuenta que a esto no le importa si ya hay subprocesos en espera en la cola, por lo que es "injusto" (para los otros subprocesos que ya están esperando). Si no pudo adquirir el bloqueo (lo que significa que alguien más lo tiene), se pone en la cola.
Por otro lado, en el modo fair
, el subproceso que llama al lock
primero debe verificar si ya hay subprocesos esperando este bloqueo. Si no hay tales subprocesos y puede tomar el bloqueo: no poner en cola y tomar el bloqueo. Si no puede, se pone en cola.
Un último punto es que, tanto en el modo justo como en el injusto, los subprocesos se colocan en la misma cola; es decir: fair/unfair
no se trata de la representación interna de la cola.