C Linux 读者写者(相对公平)

#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 rmutex, wmutex;		//读者互斥,写者互斥
sem_t S;	//S在写着到达后封锁读者
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(&S);
	P(&rmutex);
		readcount++;
        if(readcount==1)
            P(&wmutex);
    V(&rmutex);
	V(&S);

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

    P(&rmutex);
        readcount--;
        if(readcount==0)
            V(&wmutex);
    V(&rmutex);
    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(&S);
	P(&wmutex);
    	printf("Thread %d: start to write\n",id);    
    	sleep(lastingTime);     //正在写文件中
    	printf("Thread %d: end write\n",id);
    V(&wmutex);
	V(&S);
    pthread_exit(0);
}

int main()
{
    sem_init(&S,0,1);
    sem_init(&rmutex,0,1);
	sem_init(&wmutex,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(&S);
    sem_destroy(&rmutex);
	sem_destroy(&wmutex);

    return 0;
    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值