读者优先的读者写者算法c++|操作系统

C++并发实战:面试题5:读者写者问题copy on write 读者写者问题 这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。 这里采用copy on write(写时拷贝)实现,主要要理解智能指针std::shared_ptr的用法,用访问vector替代题目中的文件,代码如下: #include #include # 阅读详情

这是一个读者写者问题的c++程序,如果对其中函数有不理解的可以看我另一篇博客进程相关函数汇总解释,对照着看,可能方便你理解

#include <stdio.h>
#include <Windows.h>

#define MAX_THREAD 10
typedef struct
{
	int number;
	char thread_name[3];
	unsigned int require_moment;
	unsigned int persist_time;
}TEST_INFO;

TEST_INFO test_data[MAX_THREAD] =
{
	{1,"r1",0,1},
	{2,"r2",1,1},
	{3,"w1",3,3},
	{4,"r3",4,2},
	{5,"w2",5,6},
	{6,"w3",6,10},
	{7,"r4",7,8},
	{8,"r5",9,2},
	{9,"w4",10,18},
	{10,"w5",12,2}
};

CRITICAL_SECTION CS_DATA;//不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码称为临界区(Critical Section)。
HANDLE h_mutex_read_count = CreateMutex(NULL, FALSE, TEXT("mutex_read_count"));
HANDLE h_mutex_write_count = CreateMutex(NULL, FALSE, TEXT("mutex_write_count"));
HANDLE h_mutex_print = CreateMutex(NULL, FALSE, TEXT("mutex_print"));

int read_count = 0;//读者人数
int write_count = 0;//写者人数
void gotoxy(int x, int y)
{
	HANDLE hCon;
	hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD Pos;
	Pos.X = x;
	Pos.Y = y;
	SetConsoleCursorPosition(hCon, Pos);
}
int color(int num)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), num);
	return 0;
}

void RF_reader_thread(void* data)
{
	char thread_name[3];
	strcpy(thread_name, ((TEST_INFO*)data)->thread_name);
	Sleep(((TEST_INFO*)data)->require_moment * 1000);

	WaitForSingleObject(h_mutex_read_count, -1);//上锁
	read_count++;
	if (read_count == 1)
		EnterCriticalSection(&CS_DATA);//进入临界区,这里使用了EnterCriticalSection到后面LeaveCriticalSection退出临界区
									   //是为了保证当第一个读者线程进入该线程时候,写者进程就进不去它的资源区了,而读者仍然可以继续进入这里的资源区
									   //(因为把EnterCriticalSection和LeaveCriticalSection放进条件语句)
	ReleaseMutex(h_mutex_read_count);

	WaitForSingleObject(h_mutex_print, -1);//上锁
	gotoxy(0, 2 * (int)(((TEST_INFO*)data)->number));
	color(10);
	printf("读线程%s正在读", thread_name);
	ReleaseMutex(h_mutex_print);

	Sleep(((TEST_INFO*)data)->persist_time * 1000);



	WaitForSingleObject(h_mutex_read_count, -1);//上锁
	read_count--;
	WaitForSingleObject(h_mutex_print, -1);//上锁
	gotoxy(25, 2 * (int)(((TEST_INFO*)data)->number));
	color(10);
	printf("读线程%s离开", thread_name);
	ReleaseMutex(h_mutex_print);
	if (read_count == 0)
		LeaveCriticalSection(&CS_DATA);//退出临界区
	ReleaseMutex(h_mutex_read_count);
}


void RF_writer_thread(void* data)
{
	Sleep(((TEST_INFO*)data)->require_moment * 1000);
	EnterCriticalSection(&CS_DATA);

	WaitForSingleObject(h_mutex_print, -1);
	gotoxy(0, 2 * (int)(((TEST_INFO*)data)->number));
	color(12);
	printf("写线程%s正在写", ((TEST_INFO*)data)->thread_name);
	ReleaseMutex(h_mutex_print);
	Sleep(((TEST_INFO*)data)->persist_time * 1000);
	LeaveCriticalSection(&CS_DATA);

	WaitForSingleObject(h_mutex_print, -1);
	gotoxy(25, 2 * (int)(((TEST_INFO*)data)->number));
	color(12);
	printf("写线程%s离开", ((TEST_INFO*)data)->thread_name);
	ReleaseMutex(h_mutex_print);
}

void reader_first()
{
	int i = 0;
	HANDLE h_thread[MAX_THREAD];
	printf("读优先申请次序:");
	for (i = 0; i < MAX_THREAD; i++)
	{
		printf("%s", test_data[i].thread_name);
	}
	printf("\n");
	printf("读优先操作次序:\n");
	InitializeCriticalSection(&CS_DATA);//InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下
	for (i = 0; i < MAX_THREAD; i++)
	{
		if (test_data[i].thread_name[0] == 'r')
			h_thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(RF_reader_thread), &test_data[i], 0, NULL);
		else
			h_thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(RF_writer_thread), &test_data[i], 0, NULL);
	}
	WaitForMultipleObjects(MAX_THREAD, h_thread, TRUE, -1);
	printf("\n");
}

void main()
{
	reader_first();
}
C语言编程实战训练营:专升本必备练习题库 C语言中的数据类型是程序设计的基石,主要包括基本数据类型如int(整型)、float(单精度浮点型)、double(双精度浮点型)和char(字符型)。每种类型对应不同的内存大小与取值范围,例如int通常占4字节,可表示-2,147,483,648到2,147,483,647之间的整数。变量定义需遵循“类型+标识符”格式:变量命名应符合标识符规则:以字母或下划线开头,后接字母、数字或下划线,区分大小写且不可使用关键字。 阅读详情

相关推荐

读者写者问题_C

//主程序 int main(int argc,char *argv[]){ char select; while(1){ printf("\t\t*-----------读者写者问题------------*\n"); printf("\t\t* 1:读者优先算法 *\n"); printf("\t\t* 2:先到先服务算法 *\n"); printf("\t\t* 3:写者优先算法 *\n"); printf("\t\t* 4:退出 *\n"); printf("\t\t*-----------------------------------*\n"); printf("\t\t请选择执行(1~4)功能:"); do{ select=(char)getch(); }while(select!='1'&&select!='2'&&select!='3'&&select!='4'); system("cls"); switch(select){ case '1': reader_first(); break; case '2': first_come_first_served(); break; case '3': writer_first(); break; case '4': return 0; } printf("\nPress any key to continue."); getch(); system("cls"); } return 0; }

多线程编程——互斥量实现读者优先与写者优先策略的实现与分析

一、实验目的1、掌握基本的多线程编程技术2、掌握基本的线程间同步技术3、熟练使用pthread线程库调用接口二、实验内容编写多线程程序解决读者-写者问题:1. 至少有3个读者和2个写者2. 每个读者写者进出数据集都要求打印输出信息3. 实现读者优先策略4. 实现写者优先策略三、实验过程、结果与分析首先根据要求在进入程序的初始线程中创建2个写者3个读者,读者线程的入口函数定义为void reader...

fyp_1995的博客 1163

操作系统读者写者问题源程序

#include <windows.h> #include <conio.h> #include "fstream.h" //全局变量 int readcount=0; //读者数目 int writecount=0; //写者数目 /* 关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权。 这是让若干行代码能够“以原子操作方式”来使用资源的一种方法。 */ CRITICAL_SECTION RP_Write; //临界区 CRITICAL_SECTION cs_Write; CRITICAL_SECTION cs_Read; struct ThreadInfo //线程信息 { int Threadhao; //线程序号 char ThreadClass; //线程类别 double ThreadStartTime; //线程开始时间 double ThreadRunTime; //线程读写持续时间 }; void ReaderFun(char* file);//读者优先函数 void R_ReaderThread(void *p);//处理读者优先读者线程 void R_WriterThread(void *p);//处理读者优先写者线程 void WriterFun(char* file); void W_ReaderThread(void *p); void W_WriterThread(void * 这个程序可以供大家参考,完全可以正确运行,得到自己想要的结果。

操作系统实验——进程同步(读者写者)C++代码实现

一、实验目的 现代操作系统的核心是多道程序设计、多处理器和分布式处理器,这些方案和操作系统设计技术的基础都是并发。当多个进程并发执行时,不论是在多处理器系统的情况下,还是在单处理器多道程序系统中,都会出现冲突和合作的问题。 理解操作系统中用互斥和同步解决问题。用信号量机制分别实现读者优先和写者优先的读者-写者问题从而掌握互斥与同步的基本理念。 二、实验内容 在Windows 环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读

Carmelo_7的博客 7923

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

操作系统课程设计-读者写者问题,用C++ MFC实现的,可运行,读写优先顺序可选!

操作系统读者写者pv操作c++实现

操作系统读者写者pv操作c++实现,基本实现了老师要求的基本功能,很不错的!

【C/C++解决读者-写者问题】

有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程(只是读数据,不会对数据产生影响,而消费者读数据时,会将数据取走,因此不能两个消费者一起读数据)同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。 因此要求: 1. 允许多个读者可以同时对文件执行读操作; 2. 只允许一个写者往文件中写信息; 3. 任一写者在完成写操作之前不允许其他读者或写者工作; 4. 写者执行写操作前,应让已有的读者和写者全部退出。

wddkxg的博客 1981

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

transformer原理

qq_38253797的博客 2万+

写者优先的读者写者算法c++|操作系统

这是写者优先的读者写者问题算法的c++程序,如果对其中函数有不理解的可以看我另一篇博客进程相关函数汇总解释,对照着看,可能方便你理解 #include <stdio.h> #include <Windows.h> #define MAX_THREAD 10//待测谁的线程数 typedef struct//表示测试数据的格式 { char thread_name[3];//线程名 unsigned int require_moment;//请求操作时刻 unsigned .

LLLLQZ的博客 806

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1047

Claude Code启动失败解决方案,执行文件不兼容一键修复

Claude Code命令行工具突然报错,显示"不支持的16位应用程序"。作者排查Node版本无果后,发现是Anthropic更新导致Windows兼容性问题。解决方法很简单:卸载旧版、切换npm镜像源、重装最新版即可恢复。经验教训:遇到类似问题应先搜索社区反馈,避免无谓排查,同时注意npm源使用后及时还原。整个踩坑过程虽折腾,但最终只是简单的重装问题。

1463

操作系统 读者写者问题的实现(C++ 读者优先、写者优先)

通过信号量机制和相应的系统调用,用于线程的互斥和同步,实现读者写者问题。利用信号量机制,实现读者写者问题。 在windows 10环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按照设定进行读写操作。用信号量机制分别实现读者优先和写者优先的读者写者问题。 读者和写者问题的读写操作限制(包括读者优先和写者优先): 写写互斥:即不能有两个写者同时进行写操作。 **读写互斥:**即不能同时有一个线程在读,而另一个线程在写。 **读读允许:**即可以有一个或多个读者在读。

hhypractise的博客 2万+

数学之美:欣赏超越数e

文章目录一、e为何物?二、利息与e的关系1、利息问题2、计算利息3、欣赏螺旋线(1)螺旋线概述(2)绘制螺旋线三、e和π 一、e为何物? e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。 以e为底的对数称为自然对数(Natural Logarithm),数学中使用自然这个词的还有自然数(Natural Number)。 这里的“自然”并不是现代人所习惯的“大自然”,而是有点儿“天然存在,非人为”的意思。 二、利息与e的关系

howard2005的专栏 1718

读者与写者问题

本篇文章我们使用C++探讨一下读者与写者问题.

oncruise的博客 1904

华为OD机试真题 新系统 - 计算数列位置N的值 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2011

Simulink开发项1000例实战专栏--实例52:基于Simulink开发一个超导磁储能控制系统,实现对SMES系统的精确控制和优化

需求分析超导磁储能系统(Superconducting Magnetic Energy Storage, SMES)是一种利用超导线圈储存和释放电能的高效储能技术。SMES系统具有响应速度快、能量密度高、循环寿命长等优点,广泛应用于电力系统的调峰填谷、频率调节、电压稳定以及紧急备用电源等领域。本项目将基于Simulink平台,开发一个完整的超导磁储能控制系统,实现对SMES系统的精确控制和优化。我们将详细讲解如何设计和实现该系统,并结合实际应用案例进行说明。

xiaoheshang_123的博客 236

模拟生产者-消费者问题和读者-写者问题

一组生产者进程生产产品给一组消费者进程消费。一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得。生产者——消费者问题实际上是相互合作进程关系的一种抽象。该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。 使用一个数组来表示具有n个(0,1,…,n-1)缓冲区的缓冲池。用输入指针in来指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品后,in加1;用一个输出指针out来指示下一个可从中获取产品的缓冲区,

振华OPPO的博客世界 8204

【WLAN】【测试】WPS测试方法小结

手机 一般稍微老的手机会支持,新手机反而不支持。 比如小米6(系统版本新的话不支持)在设置——高级设置——WPS连接。 笔记本 有些笔记本(如Surface Laptop 3)天生支持WPS,比如在连接某SSID的时候,会有“也可以通过按路由器上的按钮连接”这样的字样,出来后按AP的WPS按键即可以进行连接。 Qss软件 AP mesh组网中,Controller和Agent之间通过WIFI组网,可使用WPS的方式进行连接。可利用这点用Agent来测试AP的WPS功能。 ...

一介草民,只为生活。 1万+

c++读者写者_深入理解 sync.RWMutex:解决读者-写者问题

在某个数据需要被多个线程共享访问的时候,会出现读者-写者问题(这里的「问题」是复数形式的,因为读者-写者问题有多个变种)。访问共享数据的线程有两种类型:读者和写者。读者只会读取数据,而写者则是修改它。当写者拥有了访问数据的权限后,其它的线程(不管是读者还是写者)都不能访问这个数据。这种约束的需求在现实中是存在的,比如:当写者不能原子性地修改某个数据(例如数据库)时,在修改完成之前,要读取这个数据的...

weixin_39929635的博客 642

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

39-OpenLayers多图层切换显示隐藏,支持多个Layer同时显示和隐藏,OpenLayers懒加载瓦片

fxshy的博客 462

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++实现经典同步问题(生产者消费者、读者写者、哲学家进餐、吸烟者问题)

C++实现经典同步问题(生产者消费者、读者写者、哲学家进餐、吸烟者问题)

jasean_的博客 5017

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

读者-写者问题(基于C++实现)

以下是我们实现的代码,使用了 C++11 的线程库、互斥锁和条件变量来管理读者和写者的访问。引入头文件我们定义了一个 Semaphore 结构体,用于管理互斥锁和条件变量// 信号量结构体,用于线程同步// 互斥信号量// 条件变量int sem;// 信号量计数// 全局互斥锁,用于保护输出,防止多个读者竞争输出在这篇博客中,我们实现了一个简单的多线程读者-写者模型,使用 C++ 的线程库来确保线程安全。通过使用互斥锁和条件变量,我们能够有效地管理对共享资源的访问。

BinWang_的博客 2084

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

秒杀多线程第十一篇 读者写者问题

与上一篇《秒杀多线程第十篇 生产者消费者问题》的生产者消费者问题一样,读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。 上面是读者写者问题示意图,类似于生产者消费者问题的分析过程,首先来找找哪些是属于“等待”情况。 第一.写者要等到没有读者时才能去写文件。 第二...

huobengluantiao8 557

读者写者问题(读者优先)

一、读者/写者问题定义 存在一个多个进程共享的数据区,该数据区可以是一个文件或一块内存空间,甚至可以是一组寄存器:有些进程(reader)只读取这个数据区中的数据,有些进程(writer)只往数据区中写数据。 此外,还必须满足以下条件 1、任意数量的读进程可同时读这个文件。 2、一次只有一个写进程可以写文件。 3、若存在一个写进程正在写文件,则禁止任何读进程读文件。 4、若存在读进程正在读文件,则任何写进程需等待。直至读进程当前的读进程全部执行完毕! 也就是说,读进程不需要排斥其他读进程,而写进程需要排

weixin_47700137的博客 4533

linux 读者写者问题 读者优先c++

#include #include #include #include #include #include #define READER 5 #define WRITER 3 using namespace std; int readcont=0; sem_t cont; sem_t write1; pthread_t rid[READER]; pthread_t wid[WRITE

lalalademaxi的博客 3196
上一篇: 进程互斥c++|操作系统
下一篇: 写者优先的读者写者算法c++|操作系统
LLLLQZ
博客等级 码龄7年 308粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值