`

读者写者问题

 
阅读更多

第一   写者要等到没有读者时才能去写文件。

 

第二   所有读者要等待写者完成写文件后才能去读文件。

 

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;
}

运行效果如下:

 






  • 大小: 46.4 KB
  • 大小: 30.1 KB
  • 大小: 29.1 KB
0
0
分享到:
评论
2 楼 J2EE大鸟 2013-11-26  
lvwenwen 写道
c++的发这里来

用了几年java之后,发现c++还是有必要学习的,就弄在一起了。
1 楼 lvwenwen 2013-11-26  
c++的发这里来

相关推荐

    读者写者问题写者优先实现

    读者写者问题是多线程编程中的一种经典同步问题,主要关注如何协调多个线程对共享资源的访问,确保不会出现数据不一致的情况。在Windows 2000环境下,这个问题可以通过信号量机制来解决,以实现读者优先或写者优先的...

    C++读者写者读者写者问题的跟踪描述

    读者写者问题是一个经典的多线程同步问题,它在计算机科学和编程中具有重要的理论和实践价值。在C++环境中,解决这个问题通常涉及到线程同步和互斥锁等概念。以下是对该问题的详细解释: 读者写者问题的核心是允许...

    读者写者问题的Windows下编程

    ### 读者写者问题的Windows下编程 #### 知识点概述 本文旨在探讨“读者写者问题”在Windows下的编程实现方式,并基于一个特定的资料来源——豆丁网上的一篇文档,该文档以图片形式呈现,无法直接复制文本内容。...

    c语言实现读者写者问题

    ### C语言实现读者写者问题 #### 背景与概念 在计算机科学领域,读者写者问题是典型的并发控制问题之一。这个问题的核心是如何在多个进程(或线程)之间协调对共享资源的访问:允许任意数量的“读者”同时访问共享...

    读者写者问题c++实现

    读者写者问题是一种经典的多线程同步问题,源自操作系统领域,用于解决多个进程(或线程)对共享资源的访问冲突。在这个问题中,我们有两类用户:读者和写者。读者可以同时读取资源,而写者在写入时需要独占资源,...

    读者写者问题(C++版 读写优先可选).rar

    《读者写者问题》是操作系统领域的一个经典同步问题,它主要关注如何在多线程环境下,允许多个读者同时访问共享资源,而当有写者时,必须确保写者独占资源,避免数据一致性被破坏。在这个C++版本的实现中,使用了...

    win32 读者写者问题

    在Windows操作系统中,"win32 读者写者问题"是指多线程编程中的一个经典同步问题。读者写者问题是这样一种场景:多个线程(读者)可以同时读取一个共享资源,而当有线程(写者)需要修改这个资源时,必须独占访问,...

    PV操作实现读者写者问题

    读者写者问题是并发编程中的一个经典问题,它涉及到多个读者和一个写者对共享数据的访问。在这个问题中,读者可以同时读取数据,而写者在写入时必须独占资源,以避免数据一致性问题。PV操作,即P(信号量的wait操作...

    东华大学 操作系统实验 读者写者问题 含源代码和报告

    能够编写程序模拟读者 写者问题 2 实验要求 在Windows2000环境下 创建一个控制台进程 此进程包含n个线程 用这n个线程来表示n个读者或写者 每个线程按相应测试数据文件 后面有介绍 的要求进行读写操作 用信号量...

    操作系统读者写者问题

    "操作系统读者写者问题" 操作系统读者写者问题是计算机科学中的一种经典问题,涉及到进程同步和互斥访问共享资源。该问题描述的是在多个读者和写者同时访问共享资源时,如何确保数据的一致性和安全性。 在这个问题...

    操作系统实验 读者写者问题

    ### 操作系统实验知识点:读者写者问题 #### 一、实验背景介绍 在操作系统领域,读者写者问题是一个经典的进程同步问题。该问题主要关注的是如何管理对共享资源的访问,尤其是当多个进程(包括读进程和写进程)...

    C++实现读者写者问题模拟

    在计算机系统设计中,"读者写者问题"是一个经典的多线程同步问题,它涉及到并发访问共享资源时的冲突管理。在这个问题中,有一群读者和一个或多个写者,他们都要访问一个共享数据区。读者同时读取数据时不会改变数据...

    进程同步读者写者问题

    进程同步的读者写者问题是多线程编程中的一个经典问题,它主要涉及到多个读者和一个写者对共享资源的访问控制。在这个问题中,多个读者可以同时读取资源,但只有一个写者能写入资源,而且写者写入时不能有其他读者或...

    读者写者问题课程设计

    【读者写者问题】是操作系统中典型的多进程同步问题,主要关注如何协调多个读者和多个写者对共享资源的访问,以确保数据的一致性。在这个课程设计中,学生需要在Linux或Windows环境下,使用C或Java语言实现一个程序...

    多线程模拟读者写者问题,采用读写平等方式

    在操作系统领域,读者写者问题是经典的并发控制问题,它涉及到多个读者和一个写者共享数据资源的情况。在读者写者问题中,多个读者可以同时访问数据,而写者独占资源进行修改。为了保证数据的一致性,我们需要设计一...

    读者写者问题java 代码

    《读者写者问题Java实现详解》 在计算机并发编程领域,读者写者问题是经典的问题之一,它涉及到多个读者和一个写者对共享资源的访问控制。该问题旨在保证写者在写入数据时不受读者干扰,同时允许多个读者同时读取...

    读者写者问题_C

    printf("\t\t*-----------读者写者问题------------*\n"); printf("\t\t* 1:读者优先算法 *\n"); printf("\t\t* 2:先到先服务算法 *\n"); printf("\t\t* 3:写者优先算法 *\n"); printf("\t\t* 4:退出 *\n...

Global site tag (gtag.js) - Google Analytics