概念引入
在生活中,很多时候,写数据和读数据的时间并不是对等的,即有些时候,相比较写数据,读数据的时间反而更多。通常来说,在读的过程中,往往伴随着查找的动作,中间耗时很长,给这种代码加锁,会极大地降低程序的效率。这里就提出了一种读写锁模型,专门处理这种读多写少的问题。
读写锁模型也遵循321原则
- 三种关系:写者--写者(互斥关系)、读者--读者(共享关系)、读者--写者(同步或互斥关系)
- 两种角色:读者、写者
- 一个交易场所:读写场所
读写锁模型和生产者和消费者模型很像,但是他们之间有一个本质区别,就是消费者会把生产者的数据拿走,但是读者不会把写者的数据拿走。
读写模型中还有优先级之分,分别是读者优先和写者优先。
代码实例:
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;
pthread_rwlock_t rw;//定义一个读写锁
int data = 0;
void *reader(void *arg)//读者
{
while (1)
{
pthread_rwlock_rdlock(&rw);
cout << "reader read done" << data << endl;
pthread_rwlock_unlock(&rw);
usleep(2000);
}
}
void *writer(void *arg)//写者
{
while (1)
{
pthread_rwlock_wrlock(&rw);
cout << "writer write done" << ++data << endl;
pthread_rwlock_unlock(&rw);
usleep(3000);
}
}
int main()
{
pthread_rwlock_init(&rw, NULL);//读写锁的初始化
pthread_t r[5];
pthread_t w;
int i;
for (i = 0; i<5; i++)
{
pthread_create(&r[i], NULL, reader, NULL);
}
pthread_create(&w, NULL, writer, NULL);
for (i = 0; i<5; i++)
{
pthread_join(r[i], NULL);//线程等待
}
pthread_join(w, NULL);
pthread_rwlock_destroy(&rw);
return 0;
}