多线程的同步与互斥——读者写者模型

在读者写者模型中,同样有“一二三”,一个交易场所,两种角色,三种关系。

在读者写着模型中,读者与读者之间是共享的关系,因为并没有改变资源,所以不需要互斥;写者与写者之间是互斥的关系;读者与写者之间是同步与互斥的关系。

那么如何实现这么复杂的关系呢?

读写锁可以帮助我们进行完成以上同步与互斥关系:

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);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

#include <stdio.h>                                                                                                                   
#include <stdlib.h>
#include <pthread.h>

pthread_rwlock_t lock;
//实现交易场所(这里用一个全局变量简单代替)
int g_count = 0;
//实现两种角色
void* reader(void* arg)
{
    while(1)
    {   
        pthread_rwlock_rdlock(&lock);
        printf("read %d\n", g_count);
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }   
}
void* writer(void* arg)
{
    while(1)
    {   
        pthread_rwlock_wrlock(&lock);
        g_count++;
        printf("writer %d\n", g_count);                                                                                              
        pthread_rwlock_unlock(&lock);
        sleep(1);
    }
}
//实现三种关系
int main()
{
    pthread_rwlock_init(&lock, NULL);

    pthread_t pid[4];
    int i = 0;
    for(i = 0; i < 2; ++i)
    {
        pthread_create(&pid[i], NULL, reader, NULL);
    }
    for(i = 2; i < 4; ++i)
    {
        pthread_create(&pid[i], NULL, writer, NULL);
    }
    for(i = 0; i < 4; ++i)
    {                                                                                                                                
        pthread_join(pid[i], NULL);
    }   

    pthread_rwlock_destroy(&lock);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40417029/article/details/81169830