线程的同步与互斥—读写锁
在多线程得编程中,对于一些公共的资源,其实修改的机会是比较的少的,相比较而言,更多的只是读操作,而在我们的读操作之中,常常伴随着查找,但是如果在这类代码中,加入过多的锁的话,那么就会降低我们程序的效率,为了解决这种情况,就对应了专门的操作:读写锁。
读写锁的接口:
初始化:int pthread_rwlock_init(pthread_rwlock_t* rwlock,const pthread_rwlockattr_t* restrict attr)
参数:rwlock:你要初始化的读写锁 attr:设置读写锁的属性,当传NULL的时候默认使用初始属性
Tip:PTHREAD_RWLOCK_INITIALIZER:也可以用来初始化读写锁,
初始化函数可以初始化全局变量和局部变量,但是宏只能用来初始化全局变量
销毁:int pthread_rwlock_destroy(pthread_rwlock_t* rwlock)
申请读锁:int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock)
申请写锁:int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock)
解锁:int pthread_rwlock_unlock(pthread_rwlock_t* rwlock)
对于读写锁有什么特点呢:
①:如果有某线程读数据,则允许其他线程执行读操作,但是不允许其他线程进行写操作
②:如果有某线程进行写操作,则其他线程不能进行写操作和读操作
读写锁分为读锁和写锁:
①某线程申请了读锁,则其他线程可以申请读锁,但是不能申请写锁
②某线程申请了写锁,则其他线程读锁和写锁都不能申请
现在我们用代码模拟一下,我们创建8个线程,前3个申请写锁,后面5个申请读锁
代码如下:
#include
#include
#include
int counter;
pthread_rwlock_t rwlock;
void* rount_write(void* arg)
{
int t;
int i = *(int*)arg;
free(arg);
while(1){
t = counter;
usleep(1000);
pthread_rwlock_wrlock(&rwlock);
printf("write:%d:%#X : counter=%d ++counter=%d\n",i,pthread_self(),t,++counter);
pthread_rwlock_unlock(&rwlock);
usleep(5000);
}
}
void* rount_read(void* arg)
{
int i = *(int*)arg;
free(arg);
while(1){
pthread_rwlock_rdlock(&rwlock);
printf("read:%d : %#X : counter=%d\n",i,pthread_self(),counter);
pthread_rwlock_unlock(&rwlock);
usleep(900);
}
}
int main(){
int i = 0;
pthread_t tid[8];
for(i = 0;i<3;i++)
{
int *p = (int*)malloc(sizeof(int));
*p = i;
pthread_create(&tid[i],NULL,rount_write,(void*)p);
}
for(i = 0;i<5;i++)
{
int* p = (int*)malloc(sizeof(int));
*p = i;
pthread_create(&tid[i+3],NULL,rount_read,(void*)p);
}
for(i = 0;i<8;i++)
{
pthread_join(tid[i],NULL);
}
pthread_rwlock_destroy(&rwlock);
return 0;
}
限于编者水平,文章难免有缺漏之处,欢迎指正
如需转载,请注明出处~!