2010-02-25 20 views
6

Esta es una pregunta de la entrevista. ¿Cómo se implementa un mutex de lectura/escritura? Habrá múltiples hilos para leer y escribir en un recurso. No estoy seguro de cómo hacerlo. Si hay alguna información necesaria, házmelo saber.Leer escribir mutex en C++

Actualización: No estoy seguro de si mi declaración anterior es válida/comprensible. Pero lo que realmente quiero saber es cómo implementar múltiples escrituras de lectura y múltiples en un solo objeto en términos de mutex y otros objetos de sincronización necesarios?

+0

¿Está hablando de un mutex normal o un mutex de lectura múltiple/escritura simple implementado con mutexes/semáforos/variables de condición? – stefaanv

+0

@stefaanv: No estoy seguro, pero creo que es para múltiples lecturas de escritura múltiple/mutex implementadas con mutexes/semaphres/variables de condición. ¿Hay tal cosa/camino? – jasonline

+0

Múltiples repeticiones de lectura/escritura simple no son sencillas, solo tuve una oportunidad y fallé :-(así que aquí está el enlace de wikipedia: http://en.wikipedia.org/wiki/Readers-writer_lock – stefaanv

Respuesta

12

Echa un vistazo Dekker's algorithm.

algoritmo de Dekker es el primero conocido solución correcta a la mutua problema exclusión en programación concurrente . La solución es atribuida al matemático holandés Th. J. Dekker por Edsger W. Dijkstra en su manuscrito en cooperación de procesos secuenciales . Permite dos hilos a compartir un recurso de un solo uso sin conflicto , utilizando solo la memoria compartida para la comunicación .

Tenga en cuenta que el algoritmo de Dekker utiliza una técnica spinlock (no es busy waiting).
(Th. La solución de J. Dekker, citado por E. W. Dijkstra en su EWD1303 paper) alt text

+1

me gusta que acaba de responder a la pregunta, en lugar de entrar en OS nitty arenoso :) –

1

La respuesta corta es que es sorprendentemente difícil de rodar su propio bloqueo de lectura/escritura. Es muy fácil pasar por alto un problema de tiempo muy sutil que podría resultar en un punto muerto, dos hilos pensando que tienen un bloqueo "exclusivo", etc.

En pocas palabras, necesita contar cuántos lectores están activos en cualquier momento en particular. Solo cuando el número de lectores activos es cero, debe otorgar acceso de escritura de subprocesos. Hay algunas opciones de diseño en cuanto a si los lectores o escritores tienen prioridad. (A menudo, desea dar prioridad a los escritores, en el supuesto de que la escritura se realiza con menos frecuencia). La parte (sorprendentemente) difícil es garantizar que ningún escritor tenga acceso cuando hay lectores, o viceversa.

Hay un excelente artículo de MSDN, "Compound Win32 Synchronization Objects" que lo guía a través de la creación de un bloqueo de lector/escritor. Comienza de manera simple, luego se vuelve más complicado manejar todas las cajas de esquina. Una cosa que sobresalió fue que mostraron una muestra que se veía perfectamente bien, y luego explicaron por qué en realidad no funcionaría. Si no hubieran señalado los problemas, es posible que nunca lo hayas notado. Bien vale la pena leer.

Espero que esto sea útil.

0

Esto suena como una pregunta bastante difícil para una entrevista; No "implementaría" un mutex de lectura/escritura, en el sentido de escribir uno desde cero: hay soluciones mucho mejores disponibles en el mercado. Lo sensato del mundo real sería usar un tipo de mutex existente. Quizás lo que realmente querían saber era cómo usarías ese tipo de letra.

+0

ShellShock: ¿Puede un mutex de lectura/escritura no implementarse en términos de un mutex regular y un semáforo quizás? No estoy familiarizado con los semáforos pero tengo la sensación de que el entrevistador me está llevando a esa solución. – jasonline

+1

¿Algún ejemplo de soluciones estándar que pueda recomendar? – jasonline

0

Afaik necesita una instrucción atómica para comparar y cambiar, o debe poder deshabilitar las interrupciones. Ver Compare-and-swap en wikipedia. Al menos, así es como un sistema operativo lo implementaría. Si tiene un sistema operativo, párese sobre sus hombros y use una biblioteca existente (boost por ejemplo).