读者-写者问题(三种实现方案)
来源:互联网 发布:输入域名查询真实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);}
阅读全文
0 0
- 读者-写者问题(三种实现方案)
- 有名信号量实现读者-写者问题(读者优先)
- 经典同步问题(三)---读者写者问题
- 读者写者问题的C++实现(使用boost)
- 读者写者问题浅析(代码实现)
- JAVA多线程实现读者写者问题
- java实现读者-写者问题
- 读者/写者(三种情况)
- 读者写者问题
- 读者写者问题
- 读者-写者问题
- 读者写者问题
- 读者写者问题
- 读者-写者问题
- 读者-写者问题
- 读者-写者问题
- 读者写者问题
- 读者-写者问题
- [C语言]编译器是不是帮我们优化了乘或除以用2^x表示数的指令?
- 13-StringBuffer类的概述/数组冒泡/二分查找/Arrays类/Integer类
- 【Python-3.5】win7安装Pygame
- 第七周项目2 建立链队算法库
- ccf 折点计数
- 读者-写者问题(三种实现方案)
- padding oracle attack相关之padding oracle attack
- 10.13笔记shell和const
- 新人学习笔记-Dubbo框架集合
- 【QT】笔记(三)
- Java代码解析Excel表格
- 冬天洗衣不动手,这几款智慧洗衣机可以帮到你
- 易飞9安装和授权视频
- UVALive6257-剪枝|dp-Chemist's vows