//有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。
#include <istream>
#include <Windows.h>
#include <process.h>
CRITICAL_SECTION gcs,buffer;
HANDLE readerover,writerover;
int m=0;//读者数量
BOOL SetConsoleColor(WORD wAttributes)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE)
return FALSE;
return SetConsoleTextAttribute(hConsole, wAttributes);
}
//读者线程输出函数
void readprint(char *pszformat,...)
{
va_list p;
va_start(p,pszformat);
EnterCriticalSection(&gcs);
vfprintf(stdout,pszformat,p);
LeaveCriticalSection(&gcs);
va_end(p);
}
//写者线程输出函数
void writerprint(char* psz)
{
EnterCriticalSection(&gcs);
SetConsoleColor(FOREGROUND_GREEN);
printf(" %s\n",psz);
SetConsoleColor(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
LeaveCriticalSection(&gcs);
}
//写者
unsigned int __stdcall writer(LPVOID pm)
{
writerprint("写者等待……");
WaitForSingleObject(readerover,INFINITE);
ResetEvent(writerover);
writerprint("写者写数据开始……");
Sleep(rand()%100);
writerprint("写者写数据完毕……");
SetEvent(writerover);
return 0;
}
//读者
unsigned int __stdcall reader(LPVOID pm)
{
readprint(" 编号为%d的读者进入等待中...\n", GetCurrentThreadId());
WaitForSingleObject(writerover,INFINITE);
EnterCriticalSection(&buffer);
m++;
if (m ==1)ResetEvent(readerover);
LeaveCriticalSection(&buffer);
readprint(" 编号为%d的读者读文件...\n", GetCurrentThreadId());
Sleep(rand()%100);
readprint(" 编号为%d的读者读文件结束...\n", GetCurrentThreadId());
EnterCriticalSection(&buffer);
m--;
if (m ==0) SetEvent(readerover);
LeaveCriticalSection(&buffer);
return 0;
}
void main()
{
InitializeCriticalSection(&buffer);
InitializeCriticalSection(&gcs);
readerover = CreateEvent(NULL,FALSE,TRUE,NULL);
writerover = CreateEvent(NULL,TRUE,TRUE,NULL);//第二个参数手动置位事件相当于教室门,教室门一旦打开(被触发),所以有人都可以进入直到老师去关上教室门(事件变成未触发)。自动置位事件就相当于医院里拍X光的房间门,门打开后只能进入一个人,这个人进去后会将门关上,其它人不能进入除非门重新被打开(事件重新被触发)。
HANDLE han[10];
for (auto i =0;i<2;i++)
{
han[i] = (HANDLE) _beginthreadex(NULL,0,reader,NULL,0,NULL);
}
han[2] =(HANDLE) _beginthreadex(NULL,0,writer,NULL,0,NULL);
Sleep(50);
for (auto i =3;i<10;i++)
{
han[i] = (HANDLE) _beginthreadex(NULL,0,reader,NULL,0,NULL);
}
HANDLE han1[10];
han1[2] =(HANDLE) _beginthreadex(NULL,0,writer,NULL,0,NULL);
Sleep(100);
for (auto i =0;i<2;i++)
{
han1[i] = (HANDLE) _beginthreadex(NULL,0,reader,NULL,0,NULL);
}
for (auto i =3;i<10;i++)
{
han1[i] = (HANDLE) _beginthreadex(NULL,0,reader,NULL,0,NULL);
}
WaitForMultipleObjects(10,han1,TRUE,INFINITE);
for (auto i =0;i<10;i++)
{
CloseHandle(han[i]);
CloseHandle(han1[i]);
}
CloseHandle(readerover);
CloseHandle(writerover);
DeleteCriticalSection(&gcs);
DeleteCriticalSection(&buffer);
system("pause");
}