一、读写锁:特殊的自旋锁  

    将共享资源的访问者分为 读者和写者。

    读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。

    这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。

    自旋锁设定为写的优先级高于读

  • 相关函数:

    #include<pthread.h>    

    int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); //非阻塞方式加(写)锁

    int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); //写 方式加锁

    int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); //解锁

       int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //读 方式加锁

       int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

    int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); //销毁读写锁

    int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,

              const pthread_rwlockattr_t *restrict attr);  //初始化读写锁

二、读写锁 实例

#include<stdio.h>
#include<pthread.h>

pthread_rwlock_t rw_lock;
int g_val=0;

void *reader(void *arg)
{
	while(1)
	{
		pthread_rwlock_rdlock(&rw_lock);
		printf("reader;%u,read val:%d\n",pthread_self(),g_val);
		pthread_rwlock_unlock(&rw_lock);
		sleep(1);
	}
}
void *writer(void *arg)  //写者:排他性
{
	while(1)
	{
		pthread_rwlock_wrlock(&rw_lock);
		g_val++;
		printf("writer:%u,write val:%d\n",pthread_self(),g_val);
		pthread_rwlock_unlock(&rw_lock);
		sleep(3);
	}
}
int main()
{
	pthread_rwlock_init(&rw_lock,NULL);
	pthread_t tid1,tid2;
	pthread_create(&tid1,NULL,reader,NULL);
	pthread_create(&tid2,NULL,writer,NULL);
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_rwlock_destroy(&rw_lock);
	return 0;
}

运行结果:

    wKiom1cfO8KgcsO2AABlUn_Cu0A710.jpg

    写者具有排他性,读写锁中只能有一个写者或多个读者,二者不能同时存在。