https://www.huaweicloud.com/articles/992cce27083f08de34006f20d4336fae.html
线程的安全机制——读写锁
读写锁
读写锁API
pthread_rwlock_init 初始化读写锁
pthread_rwlock_destroy 销毁读写锁
pthread_rwlock_rdlock 上读锁
pthread_rwlock_wrlock 上写锁
pthread_rwlock_unlock 解锁(读锁写锁一样)
例程:
读写锁
概念:
互斥锁与读写锁的区别就是,互斥锁不够人性化。给资源加锁的初衷就是自己操作时不会被其他线程修改,但是但多数情况下只是读一些,但是互斥锁就一刀切了,他操作时谁都不能读。为了应对这个霸道的锁,就诞生出了读写锁。
读写锁是一种比较特殊的互斥锁,它允许多个人去获取读锁,并且不会产生冲突(我们只是去读取数据,并没有改变数据,所以不存在漏洞),但是如果有人想要去获取写锁的时候,他就变成一把互斥锁,前如果有人获取到读锁或者是写锁,你的这次获取写锁的操作就会陷入阻塞。
特点:
- 如果大家都是加的读锁,这个时候读写锁是不会阻塞的
- 如果有一个人加入写锁,读写锁就马上具备互斥锁的特点,查看在这之前有没有人加锁
读写锁API
pthread_rwlock_init 初始化读写锁
pthread_rwlock_destroy 销毁读写锁
#include int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
函数功能:
pthread_rwlock_init:读写锁的初始化函数
pthread_rwlock_dest:读写锁的销毁函数
参数:
- rwlock:要操作的读写锁变量
- attr:读写锁的属性,我们一般设置为NULL,代表创建一个标准的读写锁
返回值:
- 成功则返回0,失败则返回一个错误值,errno没有被设置
pthread_rwlock_rdlock 上读锁
pthread_rwlock_wrlock 上写锁
pthread_rwlock_unlock 解锁(读锁写锁一样)
#include
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
函数功能:
- pthread_rwlock_rdlock:加上一个读锁,如果在这之前有人加上了读锁,这个操作也能够成功加上读锁,但是如果之前有人加上了写锁,则这个函数会陷入阻塞
- pthread_rwlock_wrlock:加上一个写锁,如果前面有人加上了读锁或者是写锁,都会让我们这个操作陷入阻塞
- pthread_rwlock_unlock:解锁一个读锁或者是写锁(读写锁在解锁的时候是不分类型的)
参数:
- rwlock:要操作的读写锁变量
返回值:
- 成功则返回0,失败则返回一个错误值,errno没有被设置
例程:
#include
#include
#include
#include
#include
#include
//定义的读写锁变量
pthread_rwlock_t rwlock;
void thread1(void arg)
{ int i=12; pthread_rwlock_rdlock(&rwlock);//加读锁 while(i–) { sleep(1); printf(“in thread1\n”); } pthread_rwlock_unlock(&rwlock);//解锁
}
void thread2(void arg)
{ int i=6; sleep(6); pthread_rwlock_rdlock(&rwlock);//加读锁 while(i–) { sleep(1); printf(“in thread2\n”); } pthread_rwlock_unlock(&rwlock);//解锁
}
int main(void)
{ pthread_t tid; pthread_rwlock_init( &rwlock, NULL);//初始化一把读写锁 pthread_create(&tid, NULL, thread1, NULL);//创建一条线程 pthread_create(&tid, NULL, thread2, NULL);//创建一条线程 int i=6; pthread_rwlock_wrlock(&rwlock);//加写锁 while(i–) { sleep(1); printf(“in main\n”); } pthread_rwlock_unlock(&rwlock);//解锁 pthread_join(tid, NULL); pthread_rwlock_destroy(&rwlock);//销毁读写锁 return 0;
}