“Conocimiento Hardware>Los lectores electrónicos de libros

¿Implementar un bloqueo de escritores de escritores múltiples lector dado que los lectores de instrucciones de comparación y intercambio no puedan superar a los escritores que esperan?

2015/5/2
Esta implementación utiliza una instrucción de comparación y intercambio (CAS) para administrar un bloqueo de escritores de lectura múltiple. Prioriza a los escritores, asegurando que los lectores no puedan morir de hambre. Sin embargo, no utiliza mecanismos sofisticados de cola para la equidad entre los lectores, por lo que algunos lectores podrían experimentar esperas más largas que otros.

Este código es conceptual y debe adaptarse a un lenguaje de programación específico y sus operaciones atómicas. La función `compare_and_swap` es un marcador de posición; Deberá reemplazarlo con el equivalente de su idioma (por ejemplo, `std ::atomic_compare_exchange_weak` en C ++).

`` `C ++

#Include

// Suponiendo que hay enteros atómicos disponibles. Reemplace con el equivalente de su idioma.

// Tenga en cuenta que el uso de un solo entero atómico podría tener implicaciones de rendimiento

// para un sistema de alta concurrencia. Para el código de nivel de producción, considere otros

// Estructuras de datos para una mejor escala (por ejemplo, colas atómicas).

#Include

clase MultipLerLeaderSingleRingWriterlock {

privado:

// 0:desbloqueado,> 0:número de lectores, -1:escritor esperando

std ::Atomic Lock ={0};

público:

void adquire_read () {

while (verdadero) {

int centre_value =Lock.load ();

if (current_value <0) {// Writer Waiting, intente nuevamente

// produce el procesador para que el escritor tenga una oportunidad.

// Una implementación más sofisticada podría usar una variable de condición.

continuar;

} else if (compare_and_swap (&bloquear, current_value, current_value + 1)) {

romper; // Lectura de lectura adquirida con éxito

}

}

}

Void Release_read () {

cerrar con llave--; // recuento de lector de disminución. La disminución atómica es crucial.

}

void adquire_write () {

while (verdadero) {

if (compare_and_swap (&bloquear, 0, -1)) {// adquirir bloqueo si no hay lectores ni escritores

romper; // Bloqueo de escritura adquirido con éxito

} demás {

// sigue intentándolo hasta que tenga éxito o indique el estado de espera

continuar; // WAIT, no es ideal para una alta contención

// Una versión más sofisticada podría usar una variable de condición para evitar la espera ocupada.

}

}

}

Void Release_Write () {

bloqueo =0; // Lanzamiento de lanza

}

// Función auxiliar (reemplace con la comparación y el intercambio de su idioma)

bool compare_and_swap (std ::atomic * Target, int esperado, int desireado) {

Target de retorno-> Compare_exchange_weak (esperado, deseado);

}

};

int main () {

MultiplerLeadersingleWriterlock M;

// Uso de ejemplo

m.Acquire_read ();

std ::cout <<"Reader 1 Bloqueo adquirido \ n";

m.release_read ();

std ::cout <<"Reader 1 Lanzado Lock \ n";

M.ACQUIRE_WRITE ();

std ::cout <<"Lock \ n de escritor adquirido";

M.Release_Write ();

std ::cout <<"Writer Lanzado Lock \ n";

m.Acquire_read ();

m.Acquire_read ();

std ::cout <<"Reader 2 y 3 Lock \ n";

m.release_read ();

m.release_read ();

std ::cout <<"Reader 2 y 3 Lanzado Lock \ n";

regresar 0;

}

`` `` ``

Consideraciones importantes:

* SpinLocks: Los métodos `adquirir_write` y` adquirir_read` utilizan el espera de ocupado (spinlocks). Esto es ineficiente bajo alta contención. Para el código de producción, reemplace esto con variables de condición u otras primitivas de sincronización para evitar desperdiciar ciclos de CPU.

* hambre: Si bien los escritores son priorizados, los lectores aún pueden experimentar el hambre si hay un flujo continuo de escritores. Un sistema de colas más sofisticado podría mejorar la equidad.

* Operaciones atómicas: La corrección de este bloqueo se basa en gran medida en la atomicidad de las operaciones `compare_and_swap` y de incremento/disminución. Asegúrese de que sus operaciones atómicas elegidas proporcionen las garantías necesarias.

* Manejo de errores: Una implementación sólida incluiría el manejo de errores (por ejemplo, verificar los valores de retorno de las operaciones atómicas).

* escalabilidad: Para escenarios de alta concurrencia, considere mecanismos de bloqueo más avanzados diseñados para una mejor escalabilidad.

Este ejemplo mejorado proporciona una implementación más robusta, aunque aún simplificada. Para los sistemas de producción, considere el uso de bibliotecas o marcos establecidos que proporcionan primitivas de sincronización bien probadas y altamente optimizadas. Recuerde que la sincronización es compleja y requiere una consideración cuidadosa de las posibles condiciones de carrera y los cuellos de botella de rendimiento.

Los lectores electrónicos de libros
¿Dónde se puede encontrar una lista de libros de lectores acelerados?
¿Cómo reparar un rasguño superficial en un Sony eReader
¿Cuál es la ventaja de la revisión de documentos?
¿Por qué utilizas marcadores?
¿Cuáles son los problemas de la alfabetización informática?
Cómo convertir archivos PDF para Sony Reader
¿Cuántas páginas son 750 caracteres?
¿Quieres repasar la solución de las preguntas del sistema operativo del libro de la quinta edición de William Stallings?
Conocimiento de la computadora © http://www.ordenador.online