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; } //---------------------------------------------------------------------------
结果:
相关文章推荐
- 12.[个人]C++线程入门到进阶(12)----读者写者问题&读写锁SRWLock
- 读者写者问题的C++实现(使用boost)
- readers and writers problem 读者写者问题 写者优先 C++实现
- C++并发实战:面试题5:读者写者问题copy on write
- linux 读者写者问题 读者优先c++
- win32线程创建、线程同步以及读者写者问题
- IPC学习,利用互斥体和条件变量实现读者和写者问题
- 用信号量解决读者写者问题
- 读者和写者问题的思想
- 现代操作系统-读者/写者问题
- Java实现生产者消费者问题与读者写者问题
- C# 多线程编程 经典模型 读者和写者问题
- (操作系统原理·第三章)读者-写者问题
- 秒杀多线程第十一篇 读者写者问题
- 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
- 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock .
- 优先读者的读者/写者问题的算法设计
- 经典的读者写者问题
- 读者写者问题
- 操作系统 读者写者问题(含有swing)