读者写着问题C语言Linux,C++ 读者与写者问题

读者与写者互斥,写者在写书时,读者不能进行操作。读者在读书时,写者也不可以操作。多个读者可以同时读书。

//---------------------------------------------------------------------------

#pragma hdrstop

#include

#include

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<

printf("读者%d正在等待读书......\n",GetCurrentThreadId());

//等待可以读书的事件发生

WaitForSingleObject(g_ReadEvent, INFINITE);

//不同的读者互斥

EnterCriticalSection(&g_cs);

//cout<

printf("读者%d可以读书......\n",GetCurrentThreadId());

//第一个读者,禁止写者在写书

if(0 == iCount)

{

//将写者信号量设置为未触发

ResetEvent(g_WriteEvent);

}

iCount++;

//离开互斥区

LeaveCriticalSection(&g_cs);

//做一些工作

Sleep(rand()%5*1000);

//不同的读者互斥

EnterCriticalSection(&g_cs);

// cout<

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<

char c= getchar();

//清空资源

for (int i = 0; i < iThreadNum; i++)

CloseHandle(hThread[i]);

CloseHandle(g_WriteEvent);

CloseHandle(g_ReadEvent);

DeleteCriticalSection(&g_cs);

return 0;

}

//---------------------------------------------------------------------------

结果:

4c94631c0087caa6252ef344f7c51384.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值