第一 写者要等到没有读者时才能去写文件。
第二 所有读者要等待写者完成写文件后才能去读文件。
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; }
运行效果如下:
相关推荐
读者写者问题是多线程编程中的一种经典同步问题,主要关注如何协调多个线程对共享资源的访问,确保不会出现数据不一致的情况。在Windows 2000环境下,这个问题可以通过信号量机制来解决,以实现读者优先或写者优先的...
读者写者问题是一个经典的多线程同步问题,它在计算机科学和编程中具有重要的理论和实践价值。在C++环境中,解决这个问题通常涉及到线程同步和互斥锁等概念。以下是对该问题的详细解释: 读者写者问题的核心是允许...
### 读者写者问题的Windows下编程 #### 知识点概述 本文旨在探讨“读者写者问题”在Windows下的编程实现方式,并基于一个特定的资料来源——豆丁网上的一篇文档,该文档以图片形式呈现,无法直接复制文本内容。...
### C语言实现读者写者问题 #### 背景与概念 在计算机科学领域,读者写者问题是典型的并发控制问题之一。这个问题的核心是如何在多个进程(或线程)之间协调对共享资源的访问:允许任意数量的“读者”同时访问共享...
读者写者问题是一种经典的多线程同步问题,源自操作系统领域,用于解决多个进程(或线程)对共享资源的访问冲突。在这个问题中,我们有两类用户:读者和写者。读者可以同时读取资源,而写者在写入时需要独占资源,...
《读者写者问题》是操作系统领域的一个经典同步问题,它主要关注如何在多线程环境下,允许多个读者同时访问共享资源,而当有写者时,必须确保写者独占资源,避免数据一致性被破坏。在这个C++版本的实现中,使用了...
在Windows操作系统中,"win32 读者写者问题"是指多线程编程中的一个经典同步问题。读者写者问题是这样一种场景:多个线程(读者)可以同时读取一个共享资源,而当有线程(写者)需要修改这个资源时,必须独占访问,...
读者写者问题是并发编程中的一个经典问题,它涉及到多个读者和一个写者对共享数据的访问。在这个问题中,读者可以同时读取数据,而写者在写入时必须独占资源,以避免数据一致性问题。PV操作,即P(信号量的wait操作...
能够编写程序模拟读者 写者问题 2 实验要求 在Windows2000环境下 创建一个控制台进程 此进程包含n个线程 用这n个线程来表示n个读者或写者 每个线程按相应测试数据文件 后面有介绍 的要求进行读写操作 用信号量...
"操作系统读者写者问题" 操作系统读者写者问题是计算机科学中的一种经典问题,涉及到进程同步和互斥访问共享资源。该问题描述的是在多个读者和写者同时访问共享资源时,如何确保数据的一致性和安全性。 在这个问题...
### 操作系统实验知识点:读者写者问题 #### 一、实验背景介绍 在操作系统领域,读者写者问题是一个经典的进程同步问题。该问题主要关注的是如何管理对共享资源的访问,尤其是当多个进程(包括读进程和写进程)...
在计算机系统设计中,"读者写者问题"是一个经典的多线程同步问题,它涉及到并发访问共享资源时的冲突管理。在这个问题中,有一群读者和一个或多个写者,他们都要访问一个共享数据区。读者同时读取数据时不会改变数据...
进程同步的读者写者问题是多线程编程中的一个经典问题,它主要涉及到多个读者和一个写者对共享资源的访问控制。在这个问题中,多个读者可以同时读取资源,但只有一个写者能写入资源,而且写者写入时不能有其他读者或...
【读者写者问题】是操作系统中典型的多进程同步问题,主要关注如何协调多个读者和多个写者对共享资源的访问,以确保数据的一致性。在这个课程设计中,学生需要在Linux或Windows环境下,使用C或Java语言实现一个程序...
在操作系统领域,读者写者问题是经典的并发控制问题,它涉及到多个读者和一个写者共享数据资源的情况。在读者写者问题中,多个读者可以同时访问数据,而写者独占资源进行修改。为了保证数据的一致性,我们需要设计一...
《读者写者问题Java实现详解》 在计算机并发编程领域,读者写者问题是经典的问题之一,它涉及到多个读者和一个写者对共享资源的访问控制。该问题旨在保证写者在写入数据时不受读者干扰,同时允许多个读者同时读取...
printf("\t\t*-----------读者写者问题------------*\n"); printf("\t\t* 1:读者优先算法 *\n"); printf("\t\t* 2:先到先服务算法 *\n"); printf("\t\t* 3:写者优先算法 *\n"); printf("\t\t* 4:退出 *\n...