读、写者模型
读、写者模型与生产者消费者模型类似,但是也有不同的地方,多个读者可以共享一块空间中的数据,写者之间是相互斥的,读者和读者是共享的,读者和写者之间是互斥和同步的。
读写锁:也称自旋锁,一个读写锁允许有多个读者进行资源的读取,但是只能够允许一个写者对数据进行操作。(当线程申请资源失败时,由操作系统控制一直轮询检测锁的状态)
与生产者消费者模型的区别
★读写锁也遵循生产者消费者模型中的321原则,但是与消费者和消费者之间的互斥关系不同的是 读者和读者之间时共享的,也就是说同时可以有多个读者去访问临界资源。
★区别去生产者消费者模型,消费者需要取走数据,而读者只需要看到数据
★生产者消费者是同步进行的,但是读者可能多次去读
♥创建使用销毁读写锁
创建与销毁读写锁:
//创建读写锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr)
//销毁读写锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
读者加锁
//阻塞
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
//非阻塞,成功返回0失败返回错误码
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
写者加锁
//阻塞
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
//非阻塞
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
解锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
♥实现读者写者模型
#include <stdio.h>
#include <pthread.h>
int book = 0;
pthread_rwlock_t rwlock;
void *write(void *arg)
{
while(1)
{
if(pthread_rwlock_trywrlock(&rwlock)!=0)
{
printf("reader is reading...\n");
}
else
{
printf("wrtie done...%d\n",book++);
sleep(3);
pthread_rwlock_unlock(&rwlock);
}
}
}
void *read(void *arg)
{
sleep(1);
while(1)
{
if(pthread_rwlock_tryrdlock(&rwlock)!=0)
{
printf("writer is writing...\n");
sleep(1);
}
else
{
printf("read done...%d\n",book);
pthread_rwlock_unlock(&rwlock);
}
}
}
int main()
{
pthread_rwlock_init(&rwlock,NULL);
pthread_t r,w;
pthread_create(&r,NULL,read,NULL);
pthread_create(&w,NULL,write,NULL);
pthread_join(r,NULL);
pthread_join(w,NULL);
pthread_rwlock_destroy(&rwlock);
return 0;
}
读者写着优先级
读者优先:只要有读者要读,写者就不能写,如果前面的读者还没走就来了新的读者,那么新的读者又会读,所以写者可能饿死。
写者优先:写者一到就开始写,即使这时还有读者没读完。当写者写完后,以前的读者需要重新读。
读写公平:之前的读者读完后,写者开始写;写者写完后,后面的读者才开始读。