1读写锁
读共享,写独占
2读写锁说明
读写锁与互斥量类似,不过读写锁的并行性更高。
读写锁可以有三种状态:
A读模式加锁
B写模式加锁
C不加锁
3在写加锁状态时,在解锁之前,所有试图对这个锁加锁的线程都会被阻塞。在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权限。但是如果线程希望以写模式加锁,它必须阻塞,直到所有的线程释放读锁。
4读写锁很适合对于数据结构读的次数远大于写的情况。
5.相关函数
int pthread_rwlock_init(pthread_rwlock_t*restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t*rwlock) //成功则返回0,失败则返回错误代码
int pthread_rwlock_rdlock(pthread_rwlock_t*restrict rwlock) ;//读模式加锁
int pthread_rwlock_wrlock(pthread_rwlock_t*restrict rwlock);//写模式加锁
int pthread_rwlock_unlock(pthread_rwlock_t*restrick rwlock);
intpthread_rwlock_tryrdlock(pthread_rwlock_t *restrict rwlock);
intpthread_rwlock_trywrlock(pthread_rwlock_t *restrict rwlock);
intpthread_rwlock_trywrlock(pthread_rwlock_t *restrict rwlock);
6案例说明
#include<stdio.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h>
int counter; //定义一把读写锁 pthread_rwlock_t rwlock;
//业务场景:3个线程不定时写同一全局资源, //5个线程不定时读同一个全局资源 void *th_write(void *arg) { int t; while(1) { //上锁 pthread_rwlock_wrlock(&rwlock); t = counter; //休眠100微妙 usleep(100); printf("write %x : counter = %d ++counter=%d\n", (int)pthread_self(),t,++counter); //解锁 pthread_rwlock_unlock(&rwlock); usleep(100); } }
void *th_read(void *arg) { while(1) { pthread_rwlock_rdlock(&rwlock); printf("read %x : %d\n",(int)pthread_self(),counter); pthread_rwlock_unlock(&rwlock); usleep(100); } }
/*特点是读时和写时都上锁*/ int main(void) { int i; pthread_t tid[8]; //初始锁 pthread_rwlock_init(&rwlock,NULL); for(i = 0;i < 3;i++) { pthread_create(&tid[i],NULL,th_write,NULL); } for(i = 0; i<5;i++) { //从第四个开始 pthread_create(&tid[i+3],NULL,th_read,NULL); } pthread_rwlock_destroy(&rwlock); for(i = 0;i< 8;i++) { pthread_join(tid[i],NULL); } return 0; } |
通过给读写都加锁,让读写不会出现异常。