创建一个控制台进程。此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制(包括读者优先和写者优先):
1)写-写互斥,即不能有两个写者同时进行写操作。
2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。
3)读-读允许,即可以有一个或多个读者在读。
读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。
读者-写者问题的读写操作限制(包括读者优先和写者优先):
1)写-写互斥,即不能有两个写者同时进行写操作。
2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。
3)读-读允许,即可以有一个或多个读者在读。
读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。
可以将所有读者和所有写者分别存于一个读者等待队列和一个写者等待队列中,每当读允许时,.就从读者队列中释放一个或多个读者线程进行读操作;每当写允许时,就从写者队列中释放一个写者进行写操作。
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
CRITICAL_SECTION mutex;
CRITICAL_SECTION mutexr;
int ReadCount;
int wnum[100][3];
int rnum[100][3];
int Numr = 0;
int Numw = 0;
DWORD WINAPI Reader(LPVOID pArg)
{
Sleep(rnum[(int)pArg][1]*1000);
printf("\n读者%d等待读......", rnum[(int)pArg][0]);
EnterCriticalSection(&mutexr);
if (ReadCount == 0)
EnterCriticalSection(&mutex);
ReadCount++;
LeaveCriticalSection(&mutexr);
printf("\n读者%d正在读......", rnum[(int)pArg][0]);
Sleep(rnum[(int)pArg][2]*1000);
printf("\n读者%d结束读......", rnum[(int)pArg][0]);
EnterCriticalSection(&mutexr);
ReadCount--;
if (ReadCount == 0)
LeaveCriticalSection(&mutex);
LeaveCriticalSection(&mutexr);
return 0;
}
DWORD WINAPI Writer(LPVOID pArg)
{
Sleep(wnum[(int)pArg][1] * 1000);
printf("\n\t\t\t写者%d等待写......", wnum[(int)pArg][0]);
EnterCriticalSection(&mutex);
printf("\n\t\t\t写者%d正在写......", wnum[(int)pArg][0]);
Sleep(wnum[(int)pArg][2] * 1000);
printf("\n\t\t\t写者%d结束写......", wnum[(int)pArg][0]);
LeaveCriticalSection(&mutex);
return 0;
}
int main()
{
char ch;
FILE *p;
int tmp=0;
p = fopen("test.txt", "r");
fscanf(p, "%d", &tmp);
while (tmp != EOF)
{
ch = getc(p);
while (!(ch == 'W' || ch == 'R'))
{
if (ch == EOF)
goto T;
ch = getc(p);
}
if (ch == 'W')
{
wnum[Numw][0] = tmp;
fscanf(p, "%d", &wnum[Numw][1]);
fscanf(p, "%d", &wnum[Numw][2]);
Numw++;
}
else if (ch == 'R')
{
rnum[Numr][0] = tmp;
fscanf(p, "%d", &rnum[Numr][1]);
fscanf(p, "%d", &rnum[Numr][2]);
Numr++;
}
fscanf(p, "%d", &tmp);
}
T:;
/*for (int i = 0; i < Numr; i++)
{
printf("%d", rnum[i][0]);
printf("%d", rnum[i][1]);
printf("%d", rnum[i][2]);
}*/
ReadCount = 0;
InitializeCriticalSection(&mutex);
InitializeCriticalSection(&mutexr);
HANDLE WThread[20];
HANDLE RThread[20];
for (int i = 0; i<Numr; i++)
RThread[i] = CreateThread(NULL, 0, Reader, (LPVOID)i, 0, NULL);//建立读线程
for (int i = 0; i<Numw; i++)
WThread[i] = CreateThread(NULL, 0, Writer, (LPVOID)i, 0, NULL);//建立写线程
WaitForMultipleObjects(Numr, RThread, TRUE, INFINITE);
WaitForMultipleObjects(Numw, WThread, TRUE, INFINITE);
system("pause");
return 0;
}