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

本文通过实例详细介绍了读者写者模型中的核心概念:一个交易场所(资源),两种角色(读者和写者),三种关系(共享、互斥和同步)。利用读写锁实现了不同角色之间的同步与互斥操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值