当前位置: 首页 > news >正文

基于POSIX标准库的读者-写者问题的简单实现

文章目录

  • 实验要求
  • 分析
    • 保证读写、写写互斥
    • 保证多个读者同时进行读操作
  • 读者优先
    • 实例代码
    • 分析
  • 写者优先
  • 读写公平法
    • 示例代码
    • 分析

实验要求

  1. 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。
  2. 每个线程按相应测试数据文件的要求进行读写操作。
  3. 信号量机制分别实现读者优先写者优先的读者-写者问题。

分析


由于只有一个共享文件, 而有n个读线程, n个写者线程需要互斥地对该文件进行读写操作

读者写者问题需要保证

  • 读读不互斥、允许多个读者同时进行读操作
  • 读写、写写互斥

保证读写、写写互斥


由于临界资源(共享文件)只有一个, 所以创建一个互斥信号量(资源数量只有1份)mutex_file来对进行对文件地互斥操作

保证多个读者同时进行读操作


由于需要保证多个读者不互斥地对文件进行读操作, 所以设置一个进程内的全局变量(线程共享) reading_count, 表示正在对文件进行读操作的线程的数量.

每当有一个读线程进入临界区后, 对该变量的数值+1.

由于有多个读线程, 所以对该全局变量的访问也需要互斥, 因此增加一个互斥信号量mutex_count

如果读线程判断到reading_count != 0, 则不用对信号量mutex_fileP操作, 可以直接进入临界区. 否则, 即该读线程是第一个读线程, 该读线程首先要对信号量mutex_file做P操作.

读者优先

  • 主函数

    • 打开要互斥访问的文件
    • 初始化信号量
    • 创建N个读者线程, N个写者线程mutex_file信号量代表的
  • 读者线程

    • 不断地请求对文件的操作(对信号量mutex_file进行P操作).
    • 打印读者线程id, 用于后续分析.
    • 如果成功的进入临界区, 读取文件的大小, 并打印到标准输出.
  • 写者线程

    • 不断地请求对文件的操作(对信号量mutex_file进行P操作).
    • 打印写者线程id, 用于后续分析.
    • 如果成功的进入临界区, 则对文件写一行文本, 这里为hello world\n.

实例代码

#include <iostream>
#include <vector>
#include <unistd.h>
#include <sys/file.h>
#include <pthread.h>
#include <semaphore.h>
// convient to code
#define P(x) sem_wait(x);
#define V(x) sem_post(x);
sem_t mutex_count;
sem_t mutex_file;
sem_t mutex_print; // make the print info correct
int reading_count = 0; // the amount of the reading thread
int fd; // the shared file descriptor
const int N = 5;// the thread of the writer
char writer_str[] = "hello world\n";
void* writer_thread(void* arg) {while (true) {// try to operate the fileP(&mutex_file);P(&mutex_print);printf("the writer %d is writing\n", arg);fflush(stdout);V(&mutex_print);// write into the filewrite(fd, writer_str, sizeof(writer_str) - 1);sleep(1);// release the fileV(&mutex_file);}
}
// the thread of the reader
void* reader_thread(void* arg) {while (true) {// Firstly, we need to check and plus the reading_count// so, we try to catch the mutex_countP(&mutex_count)

相关文章:

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作读者优先实例代码分析写者优先读写公平法示例代码分析实验要求 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别…...

重生我是嵌入式大能之串口调试UART

什么是串口 串口是一种在数据通讯中广泛使用的通讯接口&#xff0c;通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter)&#xff0c;其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中&#xff0c;串口常用于与外部设备进…...

【智能优化算法】蜜獾优化算法(Honey Badger Algorithm,HBA)

蜜獾优化算法(Honey Badger Algorithm,HBA)是期刊“MATHEMATICS AND COMPUTERS IN SIMULATION”&#xff08;IF 3.6&#xff09;的2022年智能优化算法 01.引言 蜜獾优化算法(Honey Badger Algorithm,HBA)受蜜獾智能觅食行为的启发&#xff0c;从数学上发展出一种求解优化问题的…...

【算法与数据结构】数组

文章目录 前言数组数组的定义数组的基本操作增加元素删除元素修改元素查找元素 C STL 中的数组arrayvector Python3 中的列表访问更改元素值遍历列表检查列表中是否存在某元素增加元素删除元素拷贝列表总结 Python3 列表的常用操作 参考资料写在最后 前言 本系列专注更新基本数…...

【数据结构】队列详解(Queue)

文章目录 有关队列的概念队列的结点设计及初始化队列的销毁判空和计数入队操作出队操作 有关队列的概念 队列:只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端…...

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和相机Statistics图像传输统计信息的技术背景Baumer工业相机通过NEOAPISDK获取相机的Statistics图像传输统计信息技术1.引…...

FreeRTOS标准库例程代码

1.设备STM32F103C8T6 2.工程模板 单片机: 部分单片机的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代码 1-FreeRTOS移植模板 #include "system.h" #include "…...

wandb: - 0.000 MB of 0.011 MB uploaded持续出现的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

分布式模式让业务更高效、更安全、更稳定

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;分布式模…...

5.11学习记录

20长安杯部分 检材 1 的操作系统版本 CentOS Linux 7.6.1810 (Core) 检材 1 中&#xff0c;操作系统的内核版本是 3.10.0-957.el7.x86_64 检材 1 中磁盘包含一个 LVM 逻辑卷&#xff0c;该 LVM 开始的逻辑区块地址&#xff08;LBA&#xff09;是 2099200 物理卷&#xff…...

Java类加载器介绍

在Java中&#xff0c;类加载器是一种动态加载类的机制&#xff0c;它负责在运行时查找、加载和链接类文件。当Java应用程序需要创建某个类的对象时&#xff0c;类加载器会在运行时查找该类对应的.class文件&#xff0c;并将其加载到Java虚拟机中。Java类加载器通常分为三层&…...

VC++ PDH/性能计数器

例子&#xff1a; PID0&#xff0c;缺省为当前进程&#xff0c;但最好是获取当前进程ID传递进去&#xff0c;当然也可以选择其它进程的ID。 PerformanceCounter pc; pc.Open(0, "//Processor(_Total)//% Processor Time"); 源实现&#xff1a; #include <windo…...

C++ 类和对象:面向对象编程基础

目录标题 1. 什么是类&#xff1f;2. 什么是对象&#xff1f;3. 如何定义一个类&#xff1f;4. 如何创建对象&#xff1f;5. 类的构造函数6. 类的析构函数7. 数据封装和访问修饰符8. 示例&#xff1a;一个简单的BankAccount类9. 使用g编译10. 再来一个简单的C程序11. 定义书籍类…...

linux 基础命令使用

命令 su 用于切换到另一个用户身份&#xff0c;通常是超级用户(root)。su命令可以用来在命令行下切换用户&#xff0c;也可以在脚本中使用。 语法&#xff1a; su [选项] [用户名] 选项&#xff1a; - -c&#xff1a;执行完命令后&#xff0c;立即退出su命令&#xff1b;…...

eve 导入linux

mkdir /opt/unetlab/addons/qemu/linux-centos7 cd /opt/unetlab/addons/qemu/linux-centos7 上传hda.qcow2 /opt/unetlab/wrappers/unl_wrapper -a fixpermissions Linux images - (eve-ng.net) Due to very high demand of this section and problems with how to crea…...

vivado新版本兼容老版本,vitis classic兼容sdk教程

new version: vivado版本2023.2 和vitisv classic 2023.2 old version: vivado 2018.3以及之前的版本 打开工程 自动升级到当前版本&#xff0c;选择OK 点击Yes,合并当前的目录架构 点击OK 点击Report IP status 勾选要升级的IP核&#xff0c;点击升级 在项目工程文件夹…...

02.02.返回倒数第k个节点

实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 注意&#xff1a;本题相对原题稍作改动 示例&#xff1a; 输入&#xff1a; 1->2->3->4->5 和 k 2 输出&#xff1a; 4 说明&#xff1a; 给定的 k 保证是有效的。 代码&#xff…...

MongoDB 从部署到掌握

一、docker部署MongoDB ## 通过docker安装MongoDB~~~shell #拉取镜像 docker pull mongo:4.0.3#创建容器 docker create --name mongodb-server -p 27017:27017 -v mongodb-data:/data/db mongo:4.0.3 --auth#启动容器 docker start mongodb-server#进入容器 docker exec -it …...

electron-vite工具打包后通过内置配置文件动态修改接口地址实现方法

系列文章目录 electronvitevue3 快速入门教程 文章目录 系列文章目录前言一、实现过程二、代码演示1.resources/env.json2.App.vue3.main/index.js4.request.js5.安装后修改 前言 使用electron-vite 工具开发项目打包完后每次要改接口地址都要重新打包&#xff0c;对于多环境…...

每日一练2024.5.9

题目&#xff1a; 给定一副牌&#xff0c;每张牌上都写着一个整数。 此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌按下述规则分成 1 组或更多组&#xff1a; 每组都有 X 张牌。组内所有的牌上都写着相同的整数。 仅当你可选的 X > 2 时返回 tru…...

双指针-15. 三数之和

文章目录1.题解2.机考代码3.知识点讲解1.res.add(Arrays.asList(nums[i], nums[l], nums[r]));2.Arrays常用方法大厂机考 / 算法题里 Arrays 只需要掌握这 5 个1. Arrays.sort(nums) —— 排序&#xff08;最常用&#xff09;2. Arrays.toString(nums) —— 打印数组3. Arrays.…...

SAP物料账核心:手把手配置OBYC中的GBB与PRD科目(含OMSK评估类关联详解)

SAP物料账核心&#xff1a;手把手配置OBYC中的GBB与PRD科目&#xff08;含OMSK评估类关联详解&#xff09; 在SAP系统中&#xff0c;物料账管理是连接物流与财务的关键桥梁。对于财务人员而言&#xff0c;理解物料移动如何触发财务过账&#xff0c;以及如何通过后台配置实现精准…...

从硬编码到动态定义:Qlib表达式引擎如何重构量化因子开发范式

从硬编码到动态定义&#xff1a;Qlib表达式引擎如何重构量化因子开发范式 【免费下载链接】qlib Qlib 是一个面向人工智能的量化投资平台&#xff0c;其目标是通过在量化投资中运用AI技术来发掘潜力、赋能研究并创造价值&#xff0c;从探索投资策略到实现产品化部署。该平台支持…...

MySQL开发者必看:金仓数据库兼容性迁移避坑指南(含外键处理技巧)

MySQL开发者必看&#xff1a;金仓数据库兼容性迁移避坑指南&#xff08;含外键处理技巧&#xff09; 当企业级应用需要从MySQL迁移到金仓数据库时&#xff0c;开发者往往会面临一系列兼容性挑战。作为国产数据库的代表&#xff0c;金仓数据库虽然提供了MySQL兼容模式&#xff0…...

Wan2.1 VAE入门:Ubuntu 20.04系统下的保姆级环境配置教程

Wan2.1 VAE入门&#xff1a;Ubuntu 20.04系统下的保姆级环境配置教程 你是不是也对那些能生成逼真图像的AI模型感到好奇&#xff0c;想自己动手试试&#xff0c;却被“环境配置”这道门槛给拦住了&#xff1f;特别是看到需要安装CUDA、cuDNN、PyTorch这些名字&#xff0c;头都…...

【亲测有效】绕开收费陷阱!教你免费安装H.265/HEVC解码器,告别视频播放“绿屏”

最近在处理一些4K视频素材时&#xff0c;又遇到了老生常谈的问题——Windows 10/11无法播放H.265编码的视频&#xff0c;提示“缺少编解码器”。 大家都知道&#xff0c;解决办法是安装那个名为“HEVC 视频扩展”的微软官方插件。 然而&#xff0c;当我满怀信心地打开Microsof…...

别再让用户点‘拒绝‘了!微信小程序订阅消息 wx.requestSubscribeMessage 的完整避坑指南(附版本兼容代码)

微信小程序订阅消息实战&#xff1a;从用户拒绝到高授权率的完整策略 每次看到后台统计里那惨淡的订阅消息授权率&#xff0c;作为开发者的你是否感到无力&#xff1f;用户总是习惯性点击"拒绝"&#xff0c;而你可能连解释的机会都没有。这不是你的代码有问题&#x…...

摆脱论文困扰!盘点2026年口碑爆棚的的AI论文写作软件

一天写完毕业论文在2026年已不再是天方夜谭。最新测评显示&#xff0c;2026年AI论文写作软件凭借强大功能&#xff0c;彻底颠覆传统写作方式&#xff0c;覆盖选题、查重、润色、排版等全流程&#xff0c;实测效率提升超300%&#xff0c;让你高效搞定论文&#xff0c;轻松应对学…...

如何快速上手BepInEx:3个高效秘诀解锁Unity游戏插件开发

如何快速上手BepInEx&#xff1a;3个高效秘诀解锁Unity游戏插件开发 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想象一下&#xff0c;你心爱的Unity游戏缺少某个功能&#xff…...

告别硬编码!Activiti7流程变量与监听器实战:动态分配审批人与业务数据流转

Activiti7流程变量与监听器实战&#xff1a;动态审批人分配与业务数据流转 在业务流程管理&#xff08;BPM&#xff09;领域&#xff0c;硬编码审批人始终是系统灵活性的主要障碍。当组织架构调整或审批规则变化时&#xff0c;传统方案往往需要重新部署流程定义。本文将深入探…...