线程的同步与互斥—读写锁

线程的同步与互斥—读写锁

在多线程得编程中,对于一些公共的资源,其实修改的机会是比较的少的,相比较而言,更多的只是读操作,而在我们的读操作之中,常常伴随着查找,但是如果在这类代码中,加入过多的锁的话,那么就会降低我们程序的效率,为了解决这种情况,就对应了专门的操作:读写锁。

读写锁的接口:

初始化: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;
}

限于编者水平,文章难免有缺漏之处,欢迎指正

如需转载,请注明出处~!

你可能感兴趣的:(Linux)