Lectura y escritura de bloqueo pthread_rwlock

1. ¿Qué es el bloqueo de lectura-escritura

   En muchos casos, se tiene acceso a las variables compartidas de las siguientes características: En la mayoría de los casos el hilo acaba de leer el valor de la variable compartida no se modifica, sólo unos pocos casos,

Hilo verdaderamente cambiará el valor de la variable compartida. En este caso, la solicitud hay necesidad de leer entre sincronizado, el acceso concurrente entre ellos es seguro. pero

Usted debe ser mutuamente excluyentes solicitudes de escritura y leer otras solicitudes.
  Esta situación existe en la práctica, tales como elementos de configuración. La mayor parte del tiempo, el cambio de configuración no va a suceder, la situación de vez en cuando aparecerá modificar la configuración. si

Uso de exclusión mutua, solicitud de lectura simultánea completamente impedido, dará lugar a la pérdida de rendimiento. En esta consideración, POSIX introdujo bloqueo de lectura-escritura.

 

II. API de escritura de bloqueo

  1. Los atributos de bloqueo de escritura

    atributos bloqueo de escritura (pthread_rwlockattr_t) tiene dos: lockkind y pshared.

    (. 1) lockkind : lectura y escritura estrategias, incluyendo la prioridad de lectura (propiedad predeterminada), la prioridad de escritura.

    Leer prioridad : Si las solicitudes posteriores vienen en el bloqueo de escritura para leer petición de bloqueo no es una solicitud de bloqueo de escritura se bloquea. Si las solicitudes de bloqueo de lectura combatido la llegada de un flujo constante, siempre que haya

        No completó un bloqueo de lectura, escritura bloqueo sin puntos. Esta política conducirá a la anterior hambre bloqueo de escritura .

    prioridad de escritura : Una vez que un bloqueo de escritura de aplicaciones de hilo, de solicitud de bloqueo de escritura solicitudes de bloqueo de vuelta pronto leído todos será bloqueado, antes de la solicitud de escritura no puede obtener un bloqueo.

enumeración
{
PTHREAD_RWLOCK_PREFER_READER_NP, // lectores de prioridad (propiedad predeterminada)
PTHREAD_RWLOCK_PREFER_WRITER_NP, // prioridad lectores
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, // escribir un plus
PTHREAD_RWLOCK_DEFAULT_NP prioridad = PTHREAD_RWLOCK_PREFER_READER_NP // lectores
};
/ * Obtener y propiedades conjunto * /
int pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t attr *, int * pref);
int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t attr *, int * pref);

 

     (2) pshared 

    PTHREAD_PROCESS_PRIVATE: bloqueo de lectura-escritura en el proceso de la competencia - propiedades predeterminadas

    PTHREAD_PROCESS_PUBLIC: la competencia entre la lectura y la escritura de bloqueo proceso 

// establecer la propiedad pshared
int pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, int pshared);
// obtener la propiedad pshared
int pthread_rwlockattr_getpshared (pthread_rwlockattr_t * attr, int * pshared);

 

  1. Crear

int pthread_rwlock_init (pthread_rwlock_t * rwlock, const pthread_rwlockattr_t * attr);

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER

  2. Obtener

int pthread_rwlock_rdlock (pthread_rwlock_t rwptr *) // 读 锁
int pthread_rwlock_wrlock (pthread_rwlock_t rwptr *) // 写 锁

  3. liberación

int pthread_rwlock_unlock (pthread_rwlock_t * rwptr) // leer o bloqueos de escritura de desbloqueo

  4. Destrucción

int pthread_rwlock_destroy (pthread_rwlock_t * rwlock);

 

III. El principio de bloqueo de lectura-escritura

variable  explicación
__bloquear Gestión de bloqueos de lectura-escritura bloquea la competencia global, si se lee o bloqueo de escritura para desbloquear la cerradura, serán mutuamente excluyentes
__escritor titular de bloqueo de escritura hilo de identificación, si es 0 indica que la corriente Cheng inalámbrico mantiene un bloqueo de escritura
__nr_reads El número de bloqueos de lectura sostenida por hilos
__nr_reads_queued El número de partes que esperan leer hilos de bloqueo
__nr_writers_queued El número de hilos de bloqueo de escritura en cola

  Si la aplicación es aplicar un bloqueo de lectura o bloqueo de escritura o de desbloqueo, no tener al menos un mutex mundial (correspondiente a __lock) del bloqueo y desbloqueo, sin tener en cuenta el bloqueo, basta con considerar

propia operación de sobrecarga, la sobrecarga de bloqueo y desbloqueo de lectura-escritura de bloqueo es el doble de la exclusión mutua. Por supuesto, antes del final de la función o antes de entrar en la obstrucción, que será un lanzamiento mundial mutex.

1. Para una solicitud de bloqueo de lectura, si:

    (I) Cheng inalámbrico mantiene un bloqueo de escritura, a saber == 0 __writer

    (II) se utiliza en la estrategia de lector de primer o no hay camareros de bloqueo de escritura (__nr_writers_queued == 0)

  cuando cuando se cumplen dos condiciones, la solicitud de bloqueo de lectura leer cerraduras están disponibles de inmediato, antes de volver a realizar __nr_readers ++, representa un incremento de un hilo posee un bloqueo de lectura.

  no se cumple, entonces la ejecución __nr_readers_queued ++, representa un incremento de una lectura de bloqueo de camareros, a continuación, llamar futex, en la obstrucción. Cuando desperté, realiza

__nr_readers_queued- y, a continuación, determina de nuevo si las condiciones Satisfacer 1 y 2

2. Para una solicitud de bloqueo de escritura, si:

    (I) la trayectoria de radio tiene el bloqueo de escritura, es decir == 0 __writer

    (II) no tiene el hilo de bloqueo, que __nr_readers == 0

  , siempre y cuando se cumplan las condiciones anteriores, se obtendrán de forma inmediata un bloqueo de escritura, el hilo conjunto __writer ID (dominio programación)

  Si no es así, entonces la ejecución __nr_writers_queued ++, que representa un incremento de un bloqueo de escritura camareros hilo, a continuación, mutex ejecución en una espera. Despierte,

__nr_writers_queued-, a continuación, volver a juicio las condiciones 1 y 2.

3. Para abrir, si el bloqueo actual es un bloqueo de escritura, a continuación, haga lo siguiente:

    realizar __writer = 0, representa un comunicado de bloqueo de escritura

    según __nr_writers_queued decidió si los camareros de bloqueo de escritura, si hay un camareros de bloqueo de escritura para despertar

 si no hay camareros de bloqueo de escritura, se determina que no hay camareros bloqueo de lectura, y si es así, se despertará en conjunto todos los camareros de bloqueo de lectura.

 Si el bloqueo actual es un bloqueo de lectura, a continuación, hacer lo siguiente:

    __nr_readers- ejecución, lo que indica una lectura ocupantes de bloqueo menos un

    __nr_readers juez es igual a 0, entonces se dice que fue el último ocupante de un bloqueo de lectura, bloqueo de escritura necesidad de despertar a la espera o que lea camareros de bloqueo:

    de acuerdo __nr_writers_queued determinar si existe un camareros de bloqueo de escritura, y si es así, despierta un hilo esperando bloqueo de escritura
    si no hay camareros de bloqueo de escritura para determinar si existe una lectura camareros de bloqueo, y si es así, despierta toda la leer los camareros de bloqueo

Supongo que te gusta

Origin www.cnblogs.com/blackandwhite/p/12447522.html
Recomendado
Clasificación