1.首先,关于信号量的问题请看上一篇博客。
2.读者和写者问题分为读者和写者对等且二者都不能多人读取,读者和写者对等但都可以读者可以多人读取,读者优先并且读者可以多人读取。写者优先但是读者可以多人读取。
3.如果是二者对等,不管是不是多人读取,只需要一个互斥量就可以了。这里要说明一点,它和生产者和消费者不一样。生产者和消费者问题的共享资源是有数目的。但是这里没有。
4.如果要实现读者可以多人,必须给读者一个单独的信号量。把读者的进入和离开分成两个步骤。只要读者进入,就释放资源。这样后面的就可以继续进入。
5.要实行读者优先,就可以给读者计数,如果读者的数目刚开始或者最后一个的情况考虑一下就可以了。
6.所以下面的读者可以多人读取并且读者优先就使用了两个信号量。不过应该用反了。应该是读者和写者共享的那个是mutex,复制的时候也是mutex,这里说一下。因为我不想改了,只是觉得写反了。
7.如果写者优先,就需要计数,类似于读者。
8,写者优先还有一个问题,就是如果现在写者在用共享变量,但是后面排队的有读者和写者,这个写者便不释放资源,直接让写一个写者使用资源即可。如此以来,读者就需要一个单独的变量。如前面所说,来保持全部写者之间的轮流。
9,这时候就剩最后一个问题就可以实现写者优先了。就是在读者控制资源的时候,有写者和读者排队,先到的先使用。我们需要一个全局信号量来做。就是来排队。
下面是读者优先的代码
#include<windows.h>
#include<fstream>
#include<cstdlib>
#include<iostream>
#include <ctime>
using namespace std;
const int MaxThread=20;
HANDLE hX;
HANDLE hWsem;
HANDLE thread[MaxThread];
int readcount;
double totaltime;
void WRITEUNIT(int iProcess)
{
printf("%dth writer begins to write.\n",iProcess);
Sleep((DWORD)(6000));
printf("End of %dth writer for writing.\n",iProcess);
}
void READUNIT(int iProce