在编写多线程的时候,有一种情况十分常见。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会高很多。通常而言,在读的过程中,往往伴随着查找的操作,中间的耗时很长。给这种代码段加锁,会极大的降低我们程序的效率。为此,我们有一种方法,就叫做读写锁
读写锁的行为
当前锁状态 | 读锁请求(读者) | 写锁请求(写者) |
无锁 | 可以 | 可以 |
读锁 | 可以 | 阻塞 |
写锁 | 阻塞 | 阻塞 |
注意:写独占。读共享。写锁优先级高。(读写之间是互斥且同步的关系)
/*##### rw.cc #####*/
#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
int book = 0;
pthread_rwlock_t rwlock; //定义一个读写锁
void *Reader(void *arg)
{
for(;;)
{
pthread_rwlock_rdlock(&rwlock); //加锁
cout<<"Read book:"<<book<<endl;
pthread_rwlock_unlock(&rwlock); //解锁
usleep(300000);
}
}
void *Writer(void *arg)
{
for(;;)
{
pthread_rwlock_rdlock(&rwlock); //初始化读写锁
book++;
cout<<"Write book"<<book<<endl;
pthread_rwlock_unlock(&rwlock);
sleep(1);
}
}
int main()
{
pthread_rwlock_init(&rwlock,NULL); //para:1.锁的地址 2.锁的属性
pthread_t r,w; //创建读锁和写锁
pthread_create(&r,NULL,Reader,NULL);
pthread_create(&w,NULL,Writer,NULL);
pthread_join(r,NULL);
pthread_join(w,NULL);
pthread_rwlock_destroy(&rwlock); //销毁锁
return 0;
}
####### Makefile #######
rw:rw.cc
g++ -o $@ $^ -lpthread -fpermissive
.PHONY:clean
clean:
rm -f rw