读者写者问题

reader1 is reading,read 2pages
reader2 is reading,read 2pages
reader2 is reading,read 3pages
reader2 is over
reader1 is reading,read 3pages
reader1 is over
reader4 is reading,read 2pages
reader4 is reading,read 3pages
reader4 is over
reader3 is reading,read 2pages
reader3 is reading,read 3pages
reader3 is over
writer is writing,page adds 2
writer is over
reader3 is reading,read 1pages
reader3 is reading,read 1pages
reader3 is over
reader1 is reading,read 1pages
reader4 is reading,read 1pages
reader4 is reading,read 1pages
reader4 is over
reader1 is reading,read 1pages
reader1 is over
reader2 is reading,read 1pages
reader2 is reading,read 1pages
reader2 is over
writer is writing,page adds 8
writer is over
reader2 is reading,read 2pages
reader1 is reading,read 2pages
reader1 is reading,read 5pages
reader1 is reading,read 1pages
reader1 is over
reader2 is reading,read 5pages
reader2 is reading,read 1pages
reader2 is over
reader4 is reading,read 2pages
reader4 is reading,read 5pages
reader4 is reading,read 1pages
reader4 is over
reader3 is reading,read 2pages
reader3 is reading,read 5pages
reader3 is reading,read 1pages
reader3 is over
writer is writing,page adds 5
writer is over

C:\Users\YSA10\source\repos\hhh\Debug\hhh.exe (进程 19108)已退出,返回代码为: -1。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...

单个写者,多个读者,读者之间可以并发,读者和写者需要互斥。

 

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <chrono>
#include <stdlib.h>
#include <string>

std::mutex mutex_t;
std::condition_variable cond_reader;
std::condition_variable cond_writer;

int write;//写者写了几页

const int size = 4;//读者人数
int num_reader = 0;//有几个读者读完了或者不读书了 当不读书的人数=size 就可以写了
std::vector<int> book(size,5);//每个读者的可读页数 
//int book1=5, book2=5, book3=5, book4=5;
std::string signal = "read";//读者优先

void writer() 
{
	while (true)
	{
		std::unique_lock<std::mutex> lk(mutex_t);
		while (signal=="read")//没读完
		{
			cond_writer.wait(lk);
		}
		write = rand() % 10 + 1;
		std::this_thread::sleep_for(std::chrono::milliseconds(1000));
		
		for (auto &x : book) 
		{
			x += write;
		}
		
		printf("writer is writing,page adds %d\n", write);
		num_reader = 0;
		signal = "read";
		printf("writer is over\n");
		cond_reader.notify_all();
	}
}
void reader(int i) 
{
	while (true)
	{
		std::unique_lock<std::mutex> lk(mutex_t);
		while (signal=="write"||book[i]==0)
		{
			cond_reader.wait(lk);
		}
		int read = rand() % book[i] + 1;
		std::this_thread::sleep_for(std::chrono::milliseconds(100*read));
		book[i] -= read;
		if (book[i] <= 0) 
		{
			printf("reader%d is reading,read %dpages\n", i+1,read+book[i]);
			printf("reader%d is over\n",i+1);
			book[i] = 0;
			num_reader++;
			if (num_reader == size)
			{
				signal = "write";
				cond_writer.notify_one();
			}
		}
		else 
		{
			printf("reader%d is reading,read %dpages\n", i + 1, read);
		}
		
	}
}
int main() 
{
	//std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	std::thread t0(writer);
	std::thread t1(reader,0);
	std::thread t2(reader,1);
	std::thread t3(reader,2);
	std::thread t4(reader,3);
	
	t0.join();
	t1.join();
	t2.join();
	t3.join();
	t4.join();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值