在编写多线程的时候,有一种情况是比较常见的。那就是,有些公共数据修改的机会比较少。相较改写,它们读的机会反而多的多。
读者写者模式:三种关系,两类人,一个场所
三种关系:
读者与读者:无关系
写者与写者:互斥
读者与写者:同步与互斥
两类人:读者,写者
一个场所:同一临界资源(数据)
自旋锁:如果所等待条件不满足,不挂起,一直申请锁。适宜某个线程占用锁时间较短。
当不断有多个读者准备读时,如果有写者到来,此时应该当前读者读完后,提高写者优先级,下个进入临界区的是写者。---------写者优先,否则会造成写者饥饿
当不断有多个写者准备写时,如果有读者到来,此时应该当前写者写完后,提高读者优先级,下个进入临界区的是读者。---------读者优先,否则会造成读者饥饿
读写锁相关函数:
#include <pthread.h>
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//写者优先
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//读者优先
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
#include<stdio.h> #include<pthread.h> int g_val=0; pthread_rwlock_t rw_lock; void* reader(void* arg) { while(1) { pthread_rwlock_rdlock(&rw_lock); printf("g_val: %d\n",g_val); pthread_rwlock_unlock(&rw_lock); } } void* writer(void* arg) { while(1) { sleep(1);//使写者隔一秒竞争一次锁资源 pthread_rwlock_wrlock(&rw_lock); g_val++; pthread_rwlock_unlock(&rw_lock); } } int main() { pthread_t tid1,tid2; pthread_rwlock_init(&rw_lock,NULL); pthread_create(&tid1,NULL,reader,NULL); pthread_create(&tid2,NULL,writer,NULL); pthread_rwlock_destroy(&rw_lock); pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0; }