第一 写者要等到没有读者时才能去写文件。
第二 所有读者要等待写者完成写文件后才能去读文件。
1. 对互斥量进行判断时,在进入关键段后还要在判断一次,实现双重检测。
2. 在读线程的第一个关键段中,使用旋转锁,可以避免在第二个关键段中,别的线程提前释放写者互斥量的情况。
3. 在写者中,只是做了比较简单的判断,来实现和读者的互斥运行。
#include <iostream> #include <windows.h> #include <process.h> using namespace std; const int NUM = 30, READER_SIZE = 10; HANDLE readS; int readThNum,total; HANDLE thread_r[NUM], thread_o[NUM], thread_w[NUM]; CRITICAL_SECTION sc, oc; bool readLock, writeLock, reverseLock; // 读线程 unsigned int __stdcall read(PVOID pm) { // 持续循环检测writeLock状态位 while(1) { if(readLock) { WaitForSingleObject(readS, INFINITE); EnterCriticalSection(&sc); // 再次检测 if(!readLock) { cout << "reversed" << endl; // 使用旋转锁,来避免当readThNum为0时的重复读取 while(reverseLock) { Sleep(50); } } total++; readThNum++; cout << GetCurrentThreadId() << "号,读进程开始..." << endl; LeaveCriticalSection(&sc); // do something... Sleep(rand() % 300); EnterCriticalSection(&sc); readThNum--; if(readThNum == 0) { readLock = false; reverseLock = true; writeLock = true; } cout << " " << GetCurrentThreadId() << "号,读进程执行完毕..." << endl; LeaveCriticalSection(&sc); ReleaseSemaphore(readS, 1, NULL); break; } else { Sleep(50); } } return 0; } // 写线程 unsigned int __stdcall write(PVOID pm) { // 持续循环检测writeLock状态位 while(1) { if(writeLock) { EnterCriticalSection(&oc); if(writeLock) { cout << GetCurrentThreadId() << "号,--------------写进程开始..." << endl; Sleep(100); cout << GetCurrentThreadId() << "号,--------------写进程执行完毕..." << endl; // 检测读线程是否已经执行完毕 if(total != 2*NUM) { writeLock = false; } readLock = true; reverseLock = false; LeaveCriticalSection(&oc); break; } else { LeaveCriticalSection(&oc); } } Sleep(50); } return 0; } int main() { readLock = true; writeLock = false; reverseLock = false; readS = CreateSemaphore(NULL, READER_SIZE, READER_SIZE, NULL); InitializeCriticalSection(&sc); InitializeCriticalSection(&oc); int i = 0; for(; i<NUM; i++) { thread_r[i] = (HANDLE) _beginthreadex(NULL, 0, read, NULL, 0, NULL); thread_w[i] = (HANDLE) _beginthreadex(NULL, 0, write, NULL, 0, NULL); } WaitForMultipleObjects(NUM, thread_r, TRUE, INFINITE); Sleep(100); // 在执行30个 读线程 for(i=0; i<NUM; i++) { thread_o[i] = (HANDLE) _beginthreadex(NULL, 0, read, NULL, 0, NULL); } // writeLock = true; WaitForMultipleObjects(NUM, thread_w, TRUE, INFINITE); WaitForMultipleObjects(NUM, thread_o, TRUE, INFINITE); DeleteCriticalSection(&sc); DeleteCriticalSection(&oc); CloseHandle(readS); cout << "运行完毕" << endl; getchar(); return 0; }
运行效果如下:
相关推荐
读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者...
能够编写程序模拟读者 写者问题 2 实验要求 在Windows2000环境下 创建一个控制台进程 此进程包含n个线程 用这n个线程来表示n个读者或写者 每个线程按相应测试数据文件 后面有介绍 的要求进行读写操作 用信号量...
读者写者问题的跟踪描述读者写者问题的跟踪描述读者写者问题的跟踪描述读者写者问题的跟踪描述读者写者问题的跟踪描述
printf("\t\t*-----------读者写者问题------------*\n"); printf("\t\t* 1:读者优先算法 *\n"); printf("\t\t* 2:先到先服务算法 *\n"); printf("\t\t* 3:写者优先算法 *\n"); printf("\t\t* 4:退出 *\n...
读者-写者问题的读写操作限制(包括读者优先和写者优先) 1) 写-写互斥:不能有两个写者同时进行写操作 2) 读-写互斥:不能同时有一个线程在读,而另一个线程在写。 3) 读-读允许:可以有一个或多个读者在读。 ...
这是一个关于操作系统中关于读者写者问题的实现,通过简单易懂的c语言代码实现其功能,既可以让读者读入数据,也可以通过写着写出数据。
读者写者问题的算法模拟 操作系统实践项目 c语言的简单实现,读者写着问题 1. 多个读者可同时读(上限20) 2.只能有一个写者在写 3. 写者优先 vc6.0下编译通过
实现操作系统经典PCI问题:读者写者问题,c++代码实现
教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
c语言实现读者写者问题,操作系统课程设计专用
读者写者问题
读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题读者写者问题
操作系统课程设计-读者写者问题,用C++ MFC实现的,可运行,读写优先顺序可选!
读者写者问题的写优先实现,操作系统的作业,自己写的,可以实现创建多个读者写者。
用C++实现的读者写者问题,对理解同步互斥问题很有帮助的
实现PV操作解决读者写者问题(读者优先)
win32 读者写者问题 win内核编程 fifo
读者写者问题实验报告 有代码有流程图 使用PV原语做题