读者-写者问题

在OS读者和写者问题中,不管是读者优先还是写者优先,都必须确保读者或写者具有共享精神

读者优先:
    在读者获得文件资源时,确保所有的读者都完成认为后再释放文件资源

写者优先:
    在写者获得文件资源时,确保当前写者阻塞队列中的所有写者都完成写操作再释放资源

注:任何一方要优先,就必须让自身具有共享精神。

1、写者优先

此展示代码中,RWmutex相当于把所有的请求进程进行分类,分为读者部分和写者部分,第一个写者抢到资源后,必须确保当前所有的写者都完成写操作,此时写者占有绝对的优先权,因此为写者优先

代码实现:(读写锁)

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#define NUM 20
void readFile(int id);
void writeFile(int id);
void randomSleep();
void* reader(void *id);
void* writer(void *id);
int readerNum = 0, writerNum = 0;
pthread_rwlock_t rwlock;

int main(void)
{
    int id[NUM];
    int i;
    pthread_t readThread[NUM], writeThread[NUM];
    pthread_rwlock_init(&rwlock, NULL);  //init lock
    srand((unsigned int)time(NULL));

    for(i = 0; i < NUM; i++)
    {
        id[i] = i;  //record pid
        pthread_create(&readThread[i], NULL, reader, (void*)&id[i]);
        pthread_create(&writeThread[i], NULL, writer, (void*)&id[i]);
    }
    for(i = 0; i < NUM; i++)
    {
        pthread_join(readThread[i], NULL);
        pthread_join(writeThread[i], NULL);
    }

    pthread_exit(0); // main thread exit
}

void *reader(void *id)
{
    randomSleep();
    pthread_rwlock_rdlock(&rwlock);
    readerNum++;
    readFile(*((int*)id));
    readerNum--;
    pthread_rwlock_unlock(&rwlock);
}
void *writer(void *id)
{
    randomSleep();
    pthread_rwlock_wrlock(&rwlock);
    writerNum++;
    writeFile(*((int*)id));
    writerNum--;
    pthread_rwlock_unlock(&rwlock);
}
void randomSleep()
{
    struct timespec tv;
    tv.tv_sec = 0;       //秒
    tv.tv_nsec = (long)(rand()*1.0/RAND_MAX * 999999999); //纳秒
    nanosleep(&tv, NULL);
}
void readFile(int id)
{
    printf("reader ID: %d; reader num: %d; writer num: %d\n", id, readerNum,writerNum);
    randomSleep();
}
void writeFile(int id)
{
    printf("writer ID: %d; reader num: %d; writer num: %d\n", id, readerNum,writerNum);
    randomSleep();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Star星屹程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值