#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;
}
linux读者写者问题
最新推荐文章于 2023-10-14 10:00:00 发布