linux读者写者问题

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
pthread_t Reader_id[100];
pthread_t Writer_id[100];
int Writer_num,Reader_num;//读者,写者个数
int Reader_count=0;//读者个数
int Writer_count=0;//写者个数
sem_t readable;//表示当前是否有写者
int data=0;//数据
pthread_mutex_t rmutex; //读者互斥访问Reader_count
pthread_mutex_t wmutex; //写者互斥访问Writer_count
pthread_mutex_t mutex; //写者对数据区的互斥访问
//读者优先
void read()
{
	int rd=rand();
	cout<<"read"<<rd<<endl;
}
void reader()//读者实现
{
	cout<<"现在有"<<Reader_count<<"个读者在读。"<<endl;
}
void write()//写者实现
{
	int rd=rand();
	cout<<"write"<<rd<<endl;
	data=rd;
}
void *Reader_first(void *arg)
{
	while(1)
	{
	sleep(1);
	pthread_mutex_lock(&rmutex);//申请Reader_count的使用权
	if(Reader_count==0)//成为第一个读者,要阻止写者进入
		pthread_mutex_lock(&mutex);
	Reader_count++;
	pthread_mutex_unlock(&rmutex);//释放reader_count的使用
	pthread_mutex_lock(&rmutex);//申请Reader_count的使用权,访问
	reader();//运行读代码
	Reader_count--;
	if(Reader_count==0)
		pthread_mutex_unlock(&mutex);//没读者了,让写者进入
	pthread_mutex_unlock(&rmutex);//释放reader_count的使用
	}
}
void *Writer_ReaderFist(void *arg)
{
	while(1)
	{
		sleep(1);
		pthread_mutex_lock(&mutex);//申请数据区对其访问
		write();
		pthread_mutex_unlock(&mutex);//释放数据区
	}
}
void *Writer_First(void *arg)
{
	while(1)
	{
	sleep(1);
	pthread_mutex_lock(&wmutex);//占用wmutex,准备修改write_count
	if(Writer_count==0)
		//pthread_mutex_lock(&readable);//第一个写者,阻止后续读者进入
		sem_wait(&readable);
	Writer_count++;
	pthread_mutex_unlock(&wmutex);//允许后续写者修改
	pthread_mutex_lock(&mutex);//写or读完成后,占用数据区
	write();//写
	pthread_mutex_unlock(&mutex);//释放
	pthread_mutex_lock(&wmutex);//占用wmutex,准备修改write_count
	Writer_count--;//写完了
	if(Writer_count==0)
		//pthread_mutex_unlock(&readable);//若为最后一个写者,则允许读者进入
		sem_post(&readable);
	pthread_mutex_unlock(&wmutex);//释放
	}
}
void *Reader_WriterFirst(void *arg)
{
	//pthread_mutex_lock(&readable);
	//cout<<"测试"<<endl;
	while(1)
	{
	sleep(1);
	sem_wait(&readable);//检查前面有无写者
	pthread_mutex_lock(&rmutex);//占用Rmutex,修改reader_count
	if(Reader_count==0)
		pthread_mutex_lock(&mutex);//第一个读者,占用数据区
	Reader_count++;
	pthread_mutex_unlock(&mutex);//释放数据区
	sem_post(&readable);
	read();//读
	Reader_count--;
	if(Reader_count==0)
		pthread_mutex_unlock(&mutex);//最后一个读者,释放数据区
	pthread_mutex_unlock(&rmutex);//允许其他读者访问
	//return 0;
	}
}
void *Fire_Reader(void *arg)
{
	while(1)
	{
		sleep(1);
		pthread_mutex_lock(&wmutex);//检测是否有写者存在
		pthread_mutex_lock(&rmutex);//申请使用Reader_count
		if(Reader_count==0)
			pthread_mutex_lock(&mutex);//第一个读者,阻止写者进入
		Reader_count++;
		pthread_mutex_unlock(&rmutex);//释放Reader_count的使用权,使得其他读者进入
		pthread_mutex_unlock(&wmutex);//
		read();//读
		pthread_mutex_lock(&rmutex);//申请使用Reader_count
		Reader_count--;
		if(Reader_count==0)
			pthread_mutex_unlock(&mutex);//无读者,释放数据,写者进入
		pthread_mutex_unlock(&rmutex);//申请使用Reader_count
	}
}
void *Fire_Writer(void *arg)
{
	while(1)
	{
		sleep(1);
		pthread_mutex_lock(&wmutex);//检测是否有写者存在,无写者进入
		pthread_mutex_lock(&mutex);//检测是否有写者存在
		write();
		pthread_mutex_unlock(&mutex);//
		pthread_mutex_unlock(&wmutex);//
	}
}
void RF()//读者优先
{
	for(int i=0;i<Reader_num;i++)	
		pthread_create(&Reader_id[i],NULL,Reader_first,NULL);
	for(int i=0;i<Writer_num;i++)
		pthread_create(&Writer_id[i],NULL,Writer_ReaderFist,NULL);
}
void WF()
{
	for(int i=0;i<Reader_num;i++)	
		pthread_create(&Reader_id[i],NULL,Reader_WriterFirst,NULL);
	for(int i=0;i<Writer_num;i++)
		pthread_create(&Writer_id[i],NULL,Writer_First,NULL);
}
void Fire()
{
	for(int i=0;i<Reader_num;i++)	
		pthread_create(&Reader_id[i],NULL,Fire_Reader,NULL);
	for(int i=0;i<Writer_num;i++)
		pthread_create(&Writer_id[i],NULL,Fire_Writer,NULL);
}
int main()
{
	
	pthread_mute`在这里插入代码片`x_init(&mutex,NULL);//初始化互斥量
	pthread_mutex_init(&rmutex,NULL);//初始化互斥量
	cout<<"请选择算法"<<endl;
	cout<<"1.读者优先"<<endl;
	cout<<"2.写者优先"<<endl;
	cout<<"3.公平对待"<<endl;
	cout<<"4.退出"<<endl;
	char x;
	while(cin>>x)
	{
		
		switch(x)
		{
			case '1':
			{
				cout<<"请输入写者、读者数量"<<endl;
				cin>>Writer_num>>Reader_num;
				RF();//读者优先
			};break;
			case '2':
			{
				cout<<"请输入写者、读者数量"<<endl;
				cin>>Writer_num>>Reader_num;
				WF();//写者优先
			};break;
			case '3':
			{
				cout<<"请输入写者、读者数量"<<endl;
		cin>>Writer_num>>Reader_num;
				Fire();//公平对待
			};break;
			case '4':
			exit(0);break;
			default:
			cout<<"输入错误"<<endl;break;
		}
	}
    return 0;
}
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值