15. Sistema operativo: bloqueo de lectura y escritura

Tabla de contenido

1. Desventajas de los bloqueos de exclusión mutua

2. Ventajas del bloqueo de lectura y escritura

3. Pasos de operación del bloqueo de lectura y escritura

4, API

(1) Inicializar/destruir bloqueos de lectura y escritura (pthread_rwlock_destroy, pthread_rwlock_init)

 (2) Bloqueo agregar bloqueo de lectura/escritura/sin bloqueo agregar bloqueo/desbloqueo de lectura/escritura

 5. Código

 6. Precauciones

1. Desventajas de los bloqueos de exclusión mutua

Cuando la mayoría de los recursos del programa son operaciones de lectura, la exclusión mutua hará que varios subprocesos se bloqueen y esperen mientras adquieren el recurso, lo que reduce la eficiencia del programa.

2. Ventajas del bloqueo de lectura y escritura

(1) Bloqueo de lectura: se permite que múltiples subprocesos lean recursos al mismo tiempo y se pueden agregar múltiples bloqueos de lectura al mismo tiempo

(2) Bloqueo de escritura: solo un subproceso puede leer recursos al mismo tiempo, y ningún otro subproceso puede retener recursos de bloqueo

3. Pasos de operación del bloqueo de lectura y escritura

(1) Inicialice el bloqueo de lectura y escritura pthread_rwlock_init()

(2) Añadir bloqueo de lectura/bloqueo de escritura pthread_rwlock_rdlock/pthread_rwlock_wrlock

(3) Desbloquee pthread_rwlock_unlock() cuando los recursos compartidos ya no se utilicen

(4) pthread_rwlock_destroy() puede destruirse cuando no se necesita el bloqueo de lectura y escritura

4, API

(1) Inicializar/destruir bloqueos de lectura y escritura (pthread_rwlock_destroy, pthread_rwlock_init)

 (2) Bloqueo agregar bloqueo de lectura/escritura/sin bloqueo agregar bloqueo/desbloqueo de lectura/escritura

 5. Código

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

char * msg = NULL ;
pthread_rwlock_t rwlock ;

void * FUNC(void * arg )
{
    
    int num = (int ) arg ;
    // printf("num:%d\n" , num); 
    while(1)
    {
        pthread_rwlock_rdlock(&rwlock);
        printf("我是%d号线程,我看到的消息是:%s\n" , (int)arg , msg) ;
        pthread_rwlock_unlock(&rwlock);
        sleep(1);//刚好所有的读锁都睡觉了,就上写锁
    }
}

int main(int argc, char const *argv[])
{
    msg = calloc(128,1);
    
    // 初始化锁资源
    pthread_rwlock_init(&rwlock, NULL );
    
    // 创建多个线程
    pthread_t thread1 ;
    pthread_t thread2 ;
    pthread_t thread3 ;
    pthread_t thread4 ;
    pthread_t thread5 ;
    pthread_t thread6 ;
    
    pthread_create(&thread1, NULL, FUNC , (void *)1 ); 
    pthread_create(&thread2, NULL, FUNC , (void *)2 ); 
    pthread_create(&thread3, NULL, FUNC , (void *)3 ); 
    pthread_create(&thread4, NULL, FUNC , (void *)4 ); 
    pthread_create(&thread5, NULL, FUNC , (void *)5 ); 
    pthread_create(&thread6, NULL, FUNC , (void *)6 ); 
    

    while (1)
    {
        // 申请上写锁 --> 写锁在同一时间内只允许上一个
        printf("等待上写锁.....\n");
        pthread_rwlock_wrlock(&rwlock);
        printf("成功获得写锁.....\n");
        fgets(msg , 128 , stdin) ;
        pthread_rwlock_unlock(&rwlock);
        printf("解除写锁状态.....\n");
        sleep(5);
    }
    

    
    return 0;
}

6. Precauciones

 Independientemente de si se trata de un bloqueo de lectura o de escritura, es necesario juzgar el estado del recurso compartido actual al bloquear;

Bloqueo de lectura: cuando un subproceso lee información, primero verifique si existe el bloqueo de escritura, si existe, espere, de lo contrario agregue un bloqueo de lectura

Bloqueo de escritura: cuando un hilo escribe información, verifique si alguien lo lee, si es así, espere, de lo contrario agregue un bloqueo de escritura

Supongo que te gusta

Origin blog.csdn.net/weixin_45981798/article/details/129884074
Recomendado
Clasificación