您的位置:首页 > 编程语言 > C语言/C++

C++ 读者与写者问题

2013-07-27 13:47 429 查看
读者与写者互斥,写者在写书时,读者不能进行操作。读者在读书时,写者也不可以操作。多个读者可以同时读书。

//---------------------------------------------------------------------------
#pragma hdrstop
#include<windows.h>
#include<iostream>
using namespace std;
//---------------------------------------------------------------------------
//互斥关键段
CRITICAL_SECTION g_cs;
//写事件
HANDLE  g_WriteEvent;
//读事件
HANDLE  g_ReadEvent;
int iCount = 0;
int iReaderNum = 4;
//COUT在多线程环境下输出有问题,必须
//加互斥变量或者临界区,使用printf没问题
//作者函数
DWORD WINAPI Writer(LPVOID lpParam)
{
printf("作者正在等待写书......\n");
//等待写事件触发
WaitForSingleObject(g_WriteEvent, INFINITE);
//作家写书,禁止作者读取
ResetEvent(g_ReadEvent);
printf("作者开始写书了......\n");
//做一些工作
Sleep(rand()%20*1000);
printf("作者开始完书了......\n");
//触发读事件,告诉读者可以读了
SetEvent(g_ReadEvent);
return 0;
}
//读者函数
DWORD WINAPI  Reader(LPVOID lpParam)
{
// cout<<"读者"<<GetCurrentThreadId()<<"正在等待读书.......\n";
printf("读者%d正在等待读书......\n",GetCurrentThreadId());
//等待可以读书的事件发生
WaitForSingleObject(g_ReadEvent, INFINITE);
//不同的读者互斥
EnterCriticalSection(&g_cs);
//cout<<"读者"<<GetCurrentThreadId()<<"可以读书.......\n";
printf("读者%d可以读书......\n",GetCurrentThreadId());
//第一个读者,禁止写者在写书
if(0 == iCount)
{
//将写者信号量设置为未触发
ResetEvent(g_WriteEvent);
}
iCount++;
//离开互斥区
LeaveCriticalSection(&g_cs);
//做一些工作
Sleep(rand()%5*1000);
//不同的读者互斥
EnterCriticalSection(&g_cs);
// cout<<"读者"<<GetCurrentThreadId()<<"停止读书了.......\n";
printf("读者%d停止读书了......\n",GetCurrentThreadId());
iCount--;
//最后一个读者
if(0 == iCount)
{
//触发写事件,告诉作家可以写了
SetEvent(g_WriteEvent);
}
LeaveCriticalSection(&g_cs);
return 0;
}
#pragma argsused
int main(int argc, char* argv[])
{
//初始化互斥的关键区
InitializeCriticalSection(&g_cs);
//false自动模式:事件被触发后,只能有一个任务进去,
//true 手动模式:事件被触发后,可以有多个任务进去,
//作者事件初始化触发(自动职位模式)
g_WriteEvent = CreateEvent(NULL, false, true, NULL);
//读者事件初始化触发(手动职位模式)
g_ReadEvent =  CreateEvent(NULL, true, true, NULL);
const int iThreadNum = 7;
HANDLE hThread[iThreadNum];
//读者线程
for(int iIndex = 1; iIndex <= 5; iIndex ++)
{
hThread[iIndex] = (HANDLE)CreateThread(NULL, 0,Reader, NULL, 0, NULL);
}
//作者线程
hThread[0] = (HANDLE)CreateThread(NULL, 0,Writer, NULL, 0, NULL);
Sleep(10*1000);
//读者线程
for(int iIndex = 5; iIndex <= iThreadNum; iIndex ++)
{
hThread[iIndex] = (HANDLE)CreateThread(NULL, 0,Reader, NULL, 0, NULL);
}
//等待所有线程结束
WaitForMultipleObjects(iThreadNum, hThread, TRUE, INFINITE);
cout<<"运行结束,按任意键退出.....\n";
char c= getchar();
//清空资源
for (int i = 0; i < iThreadNum; i++)
CloseHandle(hThread[i]);
CloseHandle(g_WriteEvent);
CloseHandle(g_ReadEvent);
DeleteCriticalSection(&g_cs);
return 0;
}
//---------------------------------------------------------------------------


结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  读者