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
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