一、读写锁:特殊的自旋锁
将共享资源的访问者分为 读者和写者。
读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与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;
}运行结果:
写者具有排他性,读写锁中只能有一个写者或多个读者,二者不能同时存在。
本文出自 “花开彼岸” 博客,请务必保留此出处http://zxtong.blog.51cto.com/10697148/1768573
原文:http://zxtong.blog.51cto.com/10697148/1768573