您的位置:首页 > 编程语言 > C语言/C++

读者写着问题(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: