读者-写者问题(三种实现方案)

来源:互联网 发布:输入域名查询真实ip 编辑:程序博客网 时间:2024/04/30 23:04
第一种 读者优先方案:#include<pthread.h>#include<semaphore.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<string>using namespace std;sem_t rmutex,wmutex;int readcount=0,writecount=0,count=0;void *write(void *id){     sem_wait(&wmutex);           printf("%s: count为 %d , ",(char *)id,count); //CS代码           count++;                                       //CS代码           printf("writecount为 %d , ",writecount); //CS代码           printf("readcount为 %d \n",readcount); //CS代码     sem_post(&wmutex);}void *read(void *id){      sem_wait(&rmutex);          if(readcount==0) sem_wait(&wmutex);          readcount++;      sem_post(&rmutex);      printf("%s:count为 %d , ",(char *)id,count); //CS代码      printf("writecount为 %d , ",writecount); //CS代码      printf("readcount为 %d \n",readcount); //CS代码      sem_wait(&rmutex);          readcount--;          if(readcount==0) sem_post(&wmutex);      sem_post(&rmutex);}int main() {    pthread_t tid[8];    sem_init(&rmutex,0,1);    sem_init(&wmutex,0,1);    for(int x=0;x<8;x++){             if(x%2==0)               pthread_create(&tid[x],NULL,write,(void *)"写者");             else                pthread_create(&tid[x],NULL,read,(void *)"读者");         }    for(int x=0;x<8;x++)        pthread_join(tid[x],NULL);}

这里写图片描述

第二种写者优先方案:#include<pthread.h>#include<semaphore.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<string>using namespace std;sem_t rmutex,wmutex,x,y,z;int writecount=0,readcount=0,count=0;void *read(void *id){     sem_wait(&z);         sem_wait(&rmutex);             sem_wait(&x);                 readcount++;                 if(readcount==1) sem_wait(&wmutex);             sem_post(&x);         sem_post(&rmutex);     sem_post(&z);     printf("%s:count为 %d , ",(char *)id,count); //CS代码     printf("writecount为 %d , ",writecount); //CS代码     printf("readcount为 %d \n",readcount); //CS代码     sem_wait(&x);         readcount--;         if(readcount==0) sem_post(&wmutex);     sem_post(&x);}void *write(void *id){       sem_wait(&y);          if(writecount==0) sem_wait(&rmutex);           writecount++;      sem_post(&y);      sem_wait(&wmutex);           printf("%s: count为 %d , ",(char *)id,count); //CS代码           count++;                                       //CS代码           printf("writecount为 %d , ",writecount); //CS代码           printf("readcount为 %d \n",readcount); //CS代码      sem_post(&wmutex);      sem_wait(&y);          writecount--;          if(writecount==0) sem_post(&rmutex);      sem_post(&y);}int main() {    pthread_t tid[8];    sem_init(&rmutex,0,1);    sem_init(&wmutex,0,1);    sem_init(&x,0,1);    sem_init(&y,0,1);    sem_init(&z,0,1);         for(int x=0;x<8;x++){             if(x%2==0)               pthread_create(&tid[x],NULL,write,(void *)"写者");             else                pthread_create(&tid[x],NULL,read,(void *)"读者");         }     for(int x=0;x<8;x++){        pthread_join(tid[x],NULL);  }}

这里写图片描述

第三种公平竞争:#include<pthread.h>#include<semaphore.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<string>using namespace std;sem_t rmutex,wmutex,queue;int readcount=0,count=0,writecount=0;void *write(void *id){     sem_wait(&queue);         sem_wait(&wmutex);     sem_post(&queue);              printf("%s: count为 %d , ",(char *)id,count); //CS代码              count++;                                       //CS代码              printf("writecount为 %d , ",writecount); //CS代码              printf("readcount为 %d \n",readcount); //CS代码         sem_post(&wmutex);}void *read(void *id){     sem_wait(&queue);         sem_wait(&rmutex);                 readcount++;                 if(readcount==1) sem_wait(&wmutex);         sem_post(&rmutex);     sem_post(&queue);     printf("%s:count为 %d , ",(char *)id,count); //CS代码     printf("writecount为 %d , ",writecount); //CS代码     printf("readcount为 %d \n",readcount); //CS代码     sem_wait(&rmutex);         readcount--;         if(readcount==0) sem_post(&wmutex);     sem_post(&rmutex);}int main() {    pthread_t tid[8];    sem_init(&rmutex,0,1);    sem_init(&wmutex,0,1);    sem_init(&queue,0,1);    for(int x=0;x<8;x++){             if(x%2==0)               pthread_create(&tid[x],NULL,write,(void *)"写者");             else                pthread_create(&tid[x],NULL,read,(void *)"读者");         }     for(int x=0;x<8;x++)        pthread_join(tid[x],NULL);}

这里写图片描述

原创粉丝点击