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;
}