标签:读写锁
一、读写锁:特殊的自旋锁
将共享资源的访问者分为 读者和写者。
读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与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