Linux多线程──读者写者问题

读者写者问题(linux)实现代码 教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。 立即下载
读者写者问题

读者写者问题也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。


程序:

[cpp]  view plain copy
  1. // reader_writer.cpp  
  2. //////////////////////////////////////////////////////////////////////  
  3. // 读者写者问题  
  4. // 有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,  
  5. // 同样有读者读时写者也不能写。  
  6. //////////////////////////////////////////////////////////////////////  
  7.   
  8. #include <pthread.h>  
  9. #include <stdio.h>  
  10. #include <unistd.h>  
  11.   
  12. // 定义数据类  
  13. class data  
  14. {  
  15. public:  
  16.     data(int i, float f):  
  17.         I(i), F(f)  
  18.     {}  
  19.   
  20.     int I;  
  21.     float F;  
  22. };  
  23.   
  24. // 读者写者读写的内容  
  25. data *p_data = NULL;  
  26.   
  27. pthread_rwlock_t lock;  
  28.   
  29. // 写者数目  
  30. const int WRITER_NUMBER = 2;  
  31.   
  32. void *reader(void *arg);  
  33. void *writer(void *arg);  
  34.   
  35. int main(int argc, char **argv)  
  36. {  
  37.     pthread_t reader_tid;  
  38.     pthread_t writer_tid[WRITER_NUMBER];  
  39.       
  40.     pthread_create(&reader_tid, NULL, reader, NULL);  
  41.     for (int i = 0; i < WRITER_NUMBER; ++i)  
  42.     {  
  43.         pthread_create(&writer_tid[i], NULL, writer, (void *)i);  
  44.     }  
  45.   
  46.     sleep(1);  
  47.       
  48.     return 0;  
  49. }  
  50.   
  51. void *reader(void *arg)  
  52. {  
  53.     int id = (int)arg;  
  54.   
  55.     pthread_detach(pthread_self());  
  56.       
  57.     while (true)  
  58.     {  
  59.         pthread_rwlock_rdlock(&lock);  
  60.         printf("reader %d is reading the data; ", id);  
  61.         if (p_data == NULL)  
  62.         {  
  63.             printf("the data is NULL\n");  
  64.         }  
  65.         else  
  66.         {  
  67.             printf("the data is (%d, %f)\n", p_data->I, p_data->F);  
  68.         }  
  69.         pthread_rwlock_unlock(&lock);  
  70.     }  
  71.     return (void *)0;  
  72. }  
  73.   
  74. void *writer(void *arg)  
  75. {  
  76.     pthread_detach(pthread_self());  
  77.   
  78.     while (true)  
  79.     {  
  80.         pthread_rwlock_wrlock(&lock);  
  81.         printf("writer is writing the data; ");  
  82.         if (p_data == NULL)  
  83.         {  
  84.             p_data = new data(1, 1.1f);  
  85.             printf("writer create the data (%d, %f)\n", p_data->I, p_data->F);  
  86.         }  
  87.         else  
  88.         {  
  89.             delete p_data;  
  90.             p_data = NULL;  
  91.             printf("writer free the data\n");  
  92.         }  
  93.         pthread_rwlock_unlock(&lock);  
  94.     }  
  95.     return (void *)0;  
  96. }  

操作系统实验1用信号量来实现读者-写者问题 大三上学期操作系统课程第一次实验,用信号量来实现读者-写者问题,读者优先 模拟程序。理解进程(或线程)及信号量的概念。 立即下载

相关推荐

操作系统课程设计-实现读者写者(Reader-Writer Problem)问题

通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。每人一台与Linux主机联网的Windows主机,普通用户权限。

[Java并发]读者写者问题

面试题 读者写者问题 题目 这也是一个非常经典的多线程题目,题目大意如下:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。 思路 利用java.util.concurrent.locks.ReentrantReadWriteLock(读写锁) 写者写文件时持有写锁,此时只能有唯一个写者写文件,且读者不能读文件。 读者读...

weixin_36210698的博客 1103

别再手动转格式了!用Java+LibreOffice命令行实现Word批量转PDF(附Docker部署避坑指南)

本文详细介绍了如何利用Java和LibreOffice命令行实现企业级Word批量转PDF的自动化解决方案,包括多线程优化、Docker化部署及常见问题排查。通过代码示例和实战经验,帮助开发者高效处理文档转换需求,提升工作效率并避免常见陷阱。

552

Linux:多线程(单例模式,其他常见的锁,读者写者问题)

设计模式就是一些大佬在编写代码的过程中,针对一些经典常见场景,给定对应解决方案,于是将其设计成一种模式,以后我们想使用就只需要套这个模式就好了。某些类,只应该具有一个对象(实例化),称之为单例。在很多服务器开发场景中,经常需要让服务器加载很多数据到内存中,此时往往需要单例的类来管理这些数据。1. 初始化读写锁功能:该函数用于初始化一个读写锁对象rwlock,可以指定属性attr,一般情况下可以传入NULL使用默认属性。参数rwlock:指向读写锁对象的指针,attr:读写锁的属性对象指针,可以为NULL。

weixin_70067429的博客 967

MATLAB/simulink电力系统之变压器仿真+变压器饱和仿真+空载变压器电流畸变原因及仿真+空载合闸励磁涌流仿真+simulink免费仿真资源

单相变压器空载运行时,原边电流主要用来产生主磁场,而电路损耗和铁芯损耗很小,因此即使外加电压很大,空载电流仍然很小。如果想观察某个相对磁导率下电感系数的数值,可以在程序中增加这样的语句,比如,在程序中end语句之后,加上L(100),运行程序后就可以得到相对磁导率为 100时的电感系数值。在交流铁芯线圈中,当交变磁通按照正弦规律变化时,受到磁路饱和的影响,线圈中的电流会发生畸变,并成为尖顶波,这就是所谓的交流磁路电流畸变。需要指出,铁芯内的主磁通Ф可以通过空载时的副边电压从来测量,两者之间的数学关系,即。

m0_37724753的博客 4230

SAP BO系统启用邮件发送功能

目录 背景 维护邮件目标 启用邮件功能 背景 为了将BO报表或BO预警信息发送给特定的收件人,需要启用SAP BO系统的邮件发送功能。 维护邮件目标 1. 登录BO系统的中央管理控制台(CMC): http://<bo server name>:<port>/BOE/CMC 2. 点击“Organize”底下的“Servers”按钮进入BO服务器界面: 3. 点击“Servers List”进入服务器列表界面,右键点击JobServer&lt.

guowenming001的博客 1963

Linux多进程读者和写者问题,Linux多线程编程——读者优先、写者优先问题

读者优先描述如果读者来:1) 无读者、写着,新读者可以读;2) 无写者等待,但有其他读者正在读,新读者可以读;3) 有写者等待,但有其他读者正在读,新读者可以读;4) 有写者写,新读者等如果写者来:1) 无读者,新写者可以写;2) 有读者,新写者等待;3) 有其他写者写或等待,新写者等待写者优先描述如果读者来:1) 无读者、写者,新读者可以读;2) 无写者等待,但有其他读者正在读,新读者可以读;3...

weixin_42403922的博客 1290

Zemax操作33--5倍激光扩束器

5倍扩束

lzy750750的博客 2933

OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)

一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程、线程、互斥等,就拿以前学过的 OS 问题开开刀啦。记得当年学读者写者问题,尤其是写者优先的时候,那是真心纠结啊。刚才还觉得理解了,过一会儿又糊涂了。现在重新再看,还是容易纠结。没办法,用得少。我把读者优先和写者优先都实现了一下。选择性重看了小部分《unix高程》使用了多线程+互斥量实现。

yaozhiyi的专栏 1万+

光线追踪渲染实战:蒙特卡洛路径追踪及其c++实现

光线追踪超越了传统的图形流水线,是一种现代的渲染。光线追踪是一种基于物理的渲染方法,通过模拟光在介质中的真实表现来输出足以逼近现实的图像。光线从光源出发,经过各种反射折射,进入摄像机。通过渲染方程描述一点的颜色,并且通过蒙特卡洛方法求解渲染方程来获取最终的像素颜色。

AKGWSB 's blog 1万+

如何解决Windows系统中缺失oem*.inf文件导致的软件运行问题

本文详细解析了Windows系统中因oem*.inf文件缺失导致软件无法运行的常见问题。文章阐述了oem*.inf文件作为安装信息文件的重要作用,并提供了从精准定位文件路径、安全获取与替换文件的手动修复步骤,到利用专业工具进行一站式修复的完整解决方案。最后,还给出了从软件安装来源、卸载习惯到系统维护等方面的预防措施,帮助用户彻底避免此类问题。

water的专栏 547

linux多线程编程——读者优先、写者优先问题

linux多线程编程——读者优先、写者优先问题 读者优先描述 如果读者来: 1)无读者、写着,新读者可以读; 2)无写者等待,但有其他读者正在读,新读者可以读; 3)有写者等待,但有其他读者正在读,新读者可以读; 4)有写者写,新读者等 如果写者来: 1)无读者,新写者可以写; 2)有读者,新写者等待; 3)有其...

weixin_30692143的博客 638

AI人工智能 Agent:在仓储物流中的应用

AI人工智能 Agent:在仓储物流中的应用 1. 背景介绍 1.1 问题的由来 仓储物流行业是全球经济运行的基石之一,涉及商品的存储、运输、分拣和配送等多个环节。随着电子商务的普及和消费者对物流速度和精确性的要求不断提高,仓储物流

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 863

OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)

一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程、线程、互斥等,就拿以前学过的 OS 问题开开刀啦。记得当年学读者写者问题,尤其是写者优先的时候,那是真心纠结啊。刚才还觉得理解了,过一会儿又糊涂了。现在重新再看,还是容易纠结。没办法,用得少。我把读者优先和写者优先都实现了一下。选择性重看了小部分《unix高程》使用了多线程+互斥量实现。 ...

weixin_34242331的博客 98

YOLO11全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 561

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

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

linux 读者优先线程编程,OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)

摘自:http://blog.youkuaiyun.com/yaozhiyi/article/details/7563869生产者消费者:http://blog.youkuaiyun.com/yaozhiyi/article/details/7563050一. 引子最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程、线程、互斥等,就拿以前学过的 OS问题开开刀啦。记得当年学读...

weixin_28764661的博客 572

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

< Linux > 多线程(单例模式、线程安全问题、读者写者问题)

目录 1、单例模式 饿汉方式实现单例模式 懒汉方式实现单例模式 单例模式实现线程池(懒汉模式) 2、STL、智能指针、线程安全 STL中的容器不是线程安全的 智能制造是否是线程安全的 其它常见的各种锁 3、读者写者问题 读写锁的函数接口 代码实现读者写者优先问题 读者加锁和写者加锁的基本原理

bit_zyx的博客 1158

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux 之 【多线程】(STL、智能指针与线程安全、读者写者问题)

这种策略确保写操作能及时执行,适合需要数据及时更新的场景,但可能造成读者饥饿——如果写者频繁出现,读者可能长时间无法获取读锁。读者优先策略下,只要存在任何读者正在读取数据,后续到达的读者可以立即获得读锁继续读取,而写者必须等待所有读者释放锁后才能写入。这种策略适合读操作极其频繁、写操作可以延迟的场景,但可能导致写者饥饿——当读者持续不断地到来时,写者可能永远无法获得写锁。写者优先策略下,一旦有写者到达并等待写锁,后续新到达的读者将被阻塞,不能插队读取,直到等待的写者完成写入操作。

zl_dfq的博客 374

Linux系统编程——多线程[补充]:懒汉模式&自旋锁&读者写者问题

在一些软件设计场景当中,要求某些类只能具有一个对象,这样的模式我们就称为单例。例如服务器类,程序加载运行后,我们希望服务器类只实例化出一个服务器对象。。以一个通俗的例子来说明饿汉和懒汉:1.饿汉说的就是吃完饭,立刻洗碗,这样做就可以在下一次吃饭的时候不用洗碗2.懒汉指的是吃完饭,先不洗碗,直到下一次吃饭时再洗碗那么放在程序设计的角度,就可这么理解饿汉和懒汉:1.饿汉指的是。

weixin_59913110的博客 1569

Linux-读者写者问题

本文介绍了读写锁在多线程编程中的应用场景及三种实现算法:读者优先、写者优先和公平算法。读写锁主要解决多读少写场景下的同步问题,其核心思想是"写独占,读共享"。文章详细分析了每种算法的实现原理,包括信号量设置和线程调度策略,并通过伪代码展示了具体实现。同时介绍了POSIX线程库中的读写锁接口函数及其使用方法。典型应用场景如售票系统,通过控制对共享变量ticket的访问,演示了读写锁如何协调读者和写者线程。不同算法在实际应用中可能产生写饥饿或读饥饿现象,需根据具体需求选择合适的策略。

2301_81265915的博客 1012

多线程同步中的读者写者问题 - linux 平台实现

<br /><br />linux 平台下的实现与 windows 很相似,只有一些代码上的小的差别。<br />1: ReaderWriterLock.h, 该文件定义了读写锁的类<br />#ifndef ReaderWriterLock_H<br />#define ReaderWriterLock_H<br />#include <bits/pthreadtypes.h><br />#include <semaphore.h><br />class ReaderWriterLock<br />{<b

yitian20000的专栏 1225

Linux多线程(读者写者问题与自旋锁)

读者写者模型类似于生产者消费者模型。同样符合321原则,即三种关系,两个角色,一个交易场所。

分享学习的知识,记录我的技术成长道路 400
上一篇: Linux下各头文件作用
下一篇: Linux多线性编程小结
LuckyJiang.2021
博客等级 码龄15年 217粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值