C Linux 读者写者(读者优先)

参考文章:
https://blog.csdn.net/lllllyt/article/details/80506885
https://blog.csdn.net/fuziwang/article/details/79824996

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

#define P sem_wait  
#define V sem_post


sem_t ws;  //写者互斥
sem_t mutex;   //互斥对readcount的修改
int readcount=0;    //记录当前读者数目

struct data     //创建一个结构体,表示进程的id,等待运行时间,进程持续时间
{    
    int id;
    int operatingTime;
    int lastingTime;
};

void * reader(void *param)
{
    int id=((struct data*)param)->id;   //传参
    int operatingTime=((struct data*)param)->operatingTime;
    int lastingTime=((struct data*)param)->lastingTime;

    sleep(operatingTime);
    printf("Thread %d: waiting to read\n",id);     //等候阅读

    P(&mutex);
        if(readcount==0)
            P(&ws);
        readcount++;
    V(&mutex);

    printf("Thread %d: start to read\n",id);    
    sleep(lastingTime);     //正在阅读中
    printf("Thread %d: end reading\n",id);

    P(&mutex);
        readcount--;
        if(readcount==0)
            V(&ws);
    V(&mutex);
    pthread_exit(0);
}

void *writer(void *param)
{
    int id=((struct data*)param)->id;   //传参
    int operatingTime=((struct data*)param)->operatingTime;
    int lastingTime=((struct data*)param)->lastingTime;

    sleep(operatingTime);
    printf("Thread %d: waiting to write\n",id);     //等候写

    P(&ws);
    printf("Thread %d: start to write\n",id);    
    sleep(lastingTime);     //正在写文件中
    printf("Thread %d: end write\n",id);
    V(&ws);
    pthread_exit(0);
}

int main()
{
    sem_init(&ws,0,1);
    sem_init(&mutex,0,1);
    pthread_t tid;  //线程id    

    int id=0;
    while (scanf("%d",&id)!=EOF)    //当输入的id不为文件结束符时,一直读取,直到输入缓存中的内容为空时停止
    {
        char role;  //是读者还是写者
        int operatingTime;
        int lastingTime;

        scanf("%c%d%d",&role,&operatingTime,&lastingTime);
        struct data*d=(struct data*)malloc(sizeof(struct data));    //结构体指针,指针调用。需要人为分配空间、释放空间、初始化
        d->id=id;
        d->operatingTime=operatingTime;
        d->lastingTime=lastingTime;

        if(role == 'r'){
            printf("Creat the %d thread: Reader\n",id);
            pthread_create(&tid,NULL,reader,d);
        }
        else if(role == 'w'){
            printf("Creat the %d thread: Writer\n",id);
            pthread_create(&tid,NULL,writer,d);
        }
    }
    sem_destroy(&mutex);
    sem_destroy(&ws);
    return 0;
    

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值