读者写着问题(C语言版本)
2018-01-23 19:36
288 查看
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <typeinfo.h> #include <sys/time.h> #include <unistd.h> #include <semaphore.h> /* 读者写着问题: 现在有一个文件被多个读者和写者共享, 读者只会读取文件, 而写者可能修改文件, 要求这个系统满足如下: 1)允许多个读者同时操作这个文件. 2)只能允许一个写者同时修改文件. 3)写者在执行完成前.不允许任何人操作文件. 4)写者在操作文件之前应该让所有的读者和写者全部退出. */ #define MAX_NUM 10 float sleepTime() { //0.5~1.5, 0.1的粒度 return (rand()%2000)/1000.0f; } //读者的数量 int reader_num; pthread_mutex_t mutex_reader_num; //对文件的类型修改是互斥的 pthread_mutex_t mutex_rw; //读者 void* read(void* arg) { srand((unsigned)time(0)); while(true){ //检测有写者在操作, 如果没有写者操作, 那么可也执行完此语句 pthread_mutex_lock(&mutex_reader_num); if(reader_num==0){ pthread_mutex_lock(&mutex_rw); } pthread_mutex_unlock(&mutex_reader_num); pthread_mutex_lock(&mutex_reader_num); reader_num ++; pthread_mutex_unlock(&mutex_reader_num); sleep(0.05); printf("%2d-结束读取\n", pthread_self()); pthread_mutex_lock(&mutex_reader_num); reader_num --; pthread_mutex_unlock(&mutex_reader_num); pthread_mutex_lock(&mutex_reader_num); if(reader_num==0){ pthread_mutex_unlock(&mutex_rw); } pthread_mutex_unlock(&mutex_reader_num); } } //运输 void* write(void* arg) { while(true){ pthread_mutex_lock(&mutex_rw); printf("\t\t%2d-开始写入\n", pthread_self()); sleep(sleepTime()); printf("\t\t%2d-结束写入\n", pthread_self()); pthread_mutex_unlock(&mutex_rw); } } int main(void) { pthread_mutex_init(&mutex_rw, NULL); pthread_mutex_init(&mutex_reader_num, NULL); int reader_num = 1; int writer_num = 10; unsigned int reader_group[reader_num]; unsigned int writer_group[writer_num]; int i; for(i=0; i<reader_num; i++){ pthread_create(&reader_group[i], NULL, read, NULL); sleep(1.234); } for(i=0; i<writer_num; i++){ pthread_create(&writer_group[i], NULL, write, NULL); sleep(1.234); } pthread_join(reader_group[0], NULL); return 0; }
相关文章推荐
- C语言:生产者-消费者问题、读者-写者问题
- C语言 - ACM题目:软件版本问题
- William Stallings 《操作系统内核和设计原理》书中Linux下C语言实现读者写者问题(写者优先)代码
- 兔子问题C语言
- Android Studio 1.0版本的安装问题
- maven中jre版本问题
- C语言中关于排序问题(一冒泡排序)
- c语言 函数 用指针传递参数 问题
- C语言回溯法九宫格数独问题
- Linux相关问题-CentOS6.5 x64版本下Tomcat无法自启动的解决办法
- 说一说科大讯飞Windows版本唤醒功能10102功能的问题
- 关于编译版本的问题
- Error retrieving parent for item: 安卓新建版本问题
- 解决ESET NOD32总提示未安装WINDOWS UPDATE最新版本问题
- win7下关于java -version和指定JDK版本不一致问题
- mysql connector c++ release 版本控制台编译问题
- C语言关于字符串操作的安全问题
- 升级Android支持库版本遇到的两个问题
- 读者写者问题之写者优先
- C语言之头文件包含问题