linux读写锁 pthread_rwlock/互斥锁pthread_mutex

1.线程锁

这两个锁都叫做线程锁
为什么要用锁:在多线程程序中,当多个线程访问同一参数时,我们不能保证哪个线程在对该参数进行操作,以及操作的顺序。也可能我们线程1需要线程2当前的数值,然而线程1读取时,线程2刚好在修改这个值,那么很有可能线程1读取的是之前的值,或者读取的一部分是之前的值,一部分是当前的值,非常之乱,所以我们加了线程锁,当参数共用时,对线程进行阻塞操作,以实现读写顺序进行。
两个锁差异:
1)读写锁 pthread_rwlock:读模式的加锁状态、写模式的加锁状态、不加锁状态。写模式只能有一个线程,而读模式可以有多个线程。(适用于读次数较多,写次数较少的情况)。
2)互斥锁pthread_mutex:锁住和未锁住,一个进程锁住变量,其他进程都无法操作,只能等待解锁。

2.锁创建

引入头文件

#include <pthread.h>

创建

pthread_rwlock_t rwlock;
pthread_mutex_t mutex;

创建了一个读写锁rwlock和一个互斥锁mutex

3.锁初始化

定义

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);


int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);//销毁锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);//销毁锁

attr:表示读写锁属性,通常传NULL,表示使用默认属性;

初始化

pthread_rwlock_init(&rwlock,NULL);
pthread_mutex_init(&mutex,NULL)

4.加锁

先提一个概念,阻塞
阻塞:二郎理解,阻塞锁,当线程执行到这里,如果锁被锁定后,那么进程就不再往下执行了,直到解锁。非阻塞锁,到这里,它会有一个返回值0或者EBUSY,然后线程继续执行不会阻塞。

我知道别人把该变量锁定了,我要么啥也别干,等它弄完,要么根据锁定状态去干别的(if(pthread_mutex_lock(&mutex)==EBUSY))。

1)pthread_mutex

定义

int pthread_mutex_lock(pthread_mutex_t *mutex);//加阻塞锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);//加非阻塞锁
int pthread_mutex_unlock(pthread_spinlock_t *lock);//解锁

加阻塞锁

pthread_mutex_lock(&mutex);
//如果mutex已锁定,则线程停止,等待mutex解锁,然后加锁

加非阻塞锁

pthread_mutex_trylock(&mutex);
//尝试加mutex锁
//如果当前mutex没有锁定,则锁定它,并返回0;
//如果当前mutex已经锁定,则不做操作,返回EBUSY;

2)pthread_rwlock
它和互斥锁的主要区别在于,它有读锁和写锁
读锁(rdlock):当锁被写者锁定时,它等待写者解锁后才能加读锁,。当被读者锁定时,它可以直接加写锁。
写锁(wrlock):无论锁被读者和写者谁锁定,都不可以加,只能等待解锁。

定义

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//加读阻塞锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//加写阻塞锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);//解锁

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);//加读非阻塞锁
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);//加写非阻塞锁

这里和互斥锁类似,包扩非阻塞锁的返回值:0、EBUSY。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值