在编写多线程的时候,有一种情况是比较常见的。那就是,有些公共数据修改的机会比较少。相较改写,它们读的机会反而多的多。

读者写者模式:三种关系,两类人,一个场所

三种关系:

    读者与读者:无关系

    写者与写者:互斥

    读者与写者:同步与互斥

两类人:读者,写者

一个场所:同一临界资源(数据)

自旋锁:如果所等待条件不满足,不挂起,一直申请锁。适宜某个线程占用锁时间较短。

当不断有多个读者准备读时,如果有写者到来,此时应该当前读者读完后,提高写者优先级,下个进入临界区的是写者。---------写者优先,否则会造成写者饥饿

当不断有多个写者准备写时,如果有读者到来,此时应该当前写者写完后,提高读者优先级,下个进入临界区的是读者。---------读者优先,否则会造成读者饥饿

读写锁相关函数:

#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;
}