<操作系统>读者写者问题(写者优先)C语言实现

2023-05-16

问题描述
在这里插入图片描述
在这里插入图片描述
代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
sem_t mrc,mwc,wr,wsem,rsem;
int readcount=0;
int writecount=0;
void *read_i(int a)
{ 

   printf("第%d号读者想读\n",a+1);
   sem_wait(&rsem);
   sem_wait(&mrc);
   readcount++;
   if(readcount==1)
   sem_wait(&wsem);
   sem_post(&mrc);
   sem_post(&rsem);
   printf("第%d号读者开始读文章\n",a+1);
   sleep(1);
   printf("第%d号读者读完文章\n",a+1);
   sem_wait(&mrc);
   readcount--;
   if(readcount==0)
   sem_post(&wsem);
   sem_post(&mrc); 
}
void *write_j(int b)
{ 
    printf("第%d号写者想写\n",b+1);
    sem_wait(&mwc);
    writecount++;
    if(writecount==1)
    sem_wait(&rsem);
    sem_post(&mwc);
    sem_wait(&wsem);
    printf("第%d号写者开始写\n",b+1);
    sleep(3);
    printf("第%d号写者写完文章\n",b+1);
    sem_post(&wsem);
    sem_wait(&mwc);
    writecount--;
    if(writecount==0)
    sem_post(&rsem);
    sem_post(&mwc); 
}
int main()
{
	int sg1,sg2,sg3,sg4,sg5;
        pthread_t writer[10],reader[10];
	sg1=sem_init(&mrc,0,1);
	sg2=sem_init(&mwc,0,1);
        sg3=sem_init(&wr,0,1);
        sg4=sem_init(&wsem,0,1);
        sg5=sem_init(&rsem,0,1);
for(int i=0;i<=4;i++)
{      
        pthread_create(&reader[i],NULL,(void *)read_i,i); 
        pthread_create(&writer[i],NULL,(void *)write_j,i);
        sleep(1);
}

for(int j=0;j<=4;j++)
{    
         pthread_join(reader[j],NULL);
}

for(int k=0;k<=4;k++)
{    
          pthread_join(writer[k],NULL);
}
         
        
      
          sleep(2);


	return 0;

}

运行截图
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<操作系统>读者写者问题(写者优先)C语言实现 的相关文章

  • Flask网页出现UnicodeDecodeError

    具体错误 xff1a UnicodeDecodeError 39 utf8 39 codec can 39 t decode byte 0xd6 in position 46 invalid continuation byte 如图 这是怎
  • 实用函数之计算某天是星期几

    功能 xff1a 给你一个日期 xff0c 计算出这一天是星期几 适用范围 xff1a 只对1600年以后的日期有效 实现语言 xff1a C C 43 43 acm相关题目 xff1a An problem about date 相关资料
  • 差分标记讲解

    引论 维护区间信息的数据结构有很多 xff0c 像线段树 树状数组等 xff1b 然而线段树之类的数据结构往往要写上一段板子 xff08 尽管不是太长 xff09 xff0c 但在算法竞赛中却很有可能导致我们与别人慢上那么几分钟 xff0c
  • 使用Flask渲染静态网页(模板)

    假设我们有了一个已经写好的网页 xff0c 我们希望把这个网页展示出来 xff0c 我们需要怎么做呢 xff1f 在Flask中我们把这一工作叫做渲染模板 xff0c 其中我们准备好的网页叫做模板 xff0c 渲染工作交给一个叫做jinja
  • Linux常用指令(初级)

    1 ls 显示当前目录下的所有文件和文件名 2 mkdir xxx xff1a 创建一个名为xxx的目录 3 touch xxx txt xff1a 创建一个名为xxx txt的文件 4 rm xxx txt xff1a 删除名为xxx t
  • 最受欢迎的菜品

    7 2 最受欢迎的菜品 20分 某自助餐厅要求餐厅的客人在就餐后进行投票 xff0c 选出一款最喜爱的菜品 xff0c 每日营业结束后进行投票统计 xff0c 选出投票数最多的菜品为最受欢迎的菜品 请编写一个程序帮助餐厅快速完成这个统计工作
  • DOS查看端口占用情况并杀死占用某个端口的进程

    输入指令 netstat ano即可查看端口占用情况 找到自己想杀死的进程 xff0c 输入指令 xff1a taskkill PID 进程ID即可杀死进程 如果显示无法杀死 xff0c 可以强杀 xff0c 即输入指令 xff1a tas
  • Error:(37, 13) Failed to resolve: com.android.support:appcompat-v7:26 <a href="install.m2.repo">Inst

    报错信息 xff1a Error 37 13 Failed to resolve com android support appcompat v7 26 lt a href 61 34 install m2 repo 34 gt Insta
  • ACM中使用唯一分解定理

    一 求出整数n的素数因子 二 求出各素数因子的指数 三 利用这两组数据求解
  • 进程与程序的区别

    1 进程是动态的 xff0c 程序是静态的 2 进程有生命周期 xff0c 程序没有生命周期 3 一个进程只能对应一个程序 xff0c 一个程序却可以对应多个进程 没有建立进程的程序不能作为一个独立的单位获得操作系统的认可
  • 轻松上手vim

    vim是一款相当不错的文本编译器 xff0c 让我来介绍一下vim的基本使用方法 首先新建一个文件 xff0c 例如main cpp 命令为touch main cpp 然后使用vim打开 xff0c 命令为vim main cpp xff
  • AtCoder Regular Contest 085 C题题解

    通过给出的样例找出规律如下 xff1a 设循环的次数为k xff0c 则 k 61 2 m 设每次循环的花费为c xff0c 则 c 61 xff08 n m xff09 100 43 m 1900 故总的运行时间 x 61 k c 代码如
  • Split Linked List in Parts(LeetCode725)

    参加LeetCode weekly contest 58时的一道价值5分的题 xff0c 是关于数据结构的 要求将一个链表均分为k份 xff0c 如果不能均分 xff08 例如链表有6个节点而k 61 5 xff09 xff0c 则各个部分
  • Find Pivot Index(LeetCode 724)

    本想用贪心结果WA xff0c 看来只能老老实实的用枚举了 xff0c 简单粗暴实用 枚举中心轴 xff0c 从0开始 xff0c 定义两个变量left 和 right分别代表轴左边的数据之和以及轴右边的数据之和 xff0c 判断left是
  • B - fLIP

    题目链接 xff1a http code festival 2017 quala contest atcoder jp tasks code festival 2017 quala b 解题思路 xff1a 一个棋盘有N行 xff0c M列
  • 无根树转有根数

    include lt stdio h gt include lt vector gt include lt queue gt using namespace std const int maxn 61 1000 43 10 vector l
  • 【VC ++ 2010】 C语言 计算机二级编译器 Visual C ++ 2010 Express(中文学习版)的安装与使用

    文章目录 1 安装包地址2 安装2 1 安装VC 43 43 20102 2 打开VC 43 43 20102 3 注册 3 使用3 1 新建项目3 2 打开项目3 3 编写C文件并运行 1 安装包地址 链接 xff1a https pan
  • 怎样解题表

    怎样解题表是由美国数学家G 波利特提出的 具体的介绍见 xff1a https baike baidu com item E6 80 8E E6 A0 B7 E8 A7 A3 E9 A2 98 551528 fr 61 aladdin 怎样
  • C++中的::运算符

    原文出处 xff1a http blog csdn net libing zeng article details 54412935 一两行以上的成员函数最好被定义在类体之外 这要求一个特殊的声明语化来标识一 个函数是一个类的成员 xff1
  • C++创建类并应用

    新建一个Point h文件 在该文件中定义Point类 xff0c 代码如下 ifndef POINT H define POINT H class Point public Point void setPoint int x int y

随机推荐

  • UVA808(对蜂窝建立坐标系)

    这个题我是通过建立坐标系加找规律做出来的 xff0c 个人感觉难点是建立坐标系 xff0c 所以我将着重讲一下坐标系是怎么建立的 建立坐标系 xff1a 如果你有兴趣的话 xff0c 你可以将他给的图沿横线延长 xff0c 这样一个正六边形
  • Cats and Fish2017北京赛区网络同步赛

    题目链接 xff1a http hihocoder com problemset problem 1631 首先根据吃鱼的速度从小到大排序 xff0c 然后从1到x按着时间轴枚举猫的行为 xff0c 如果是吃完一条判断一下他的状态是正在吃鱼
  • leetcode729. My Calendar I

    设一个字典记录所有被预定的页面 xff0c 然后就是判断区间相交了 当发生以下两种情况之一时认为区间相交 1 起点小于左端点且终点大于左端点 2 起点大于等于左端点且起点小于右端点 代码如下 span class hljs class sp
  • 搭建java web开发环境(eclipse)

    引论 工欲善其事 xff0c 必先利其器 xff1b 想要进行web开发就必须有一款顺手的武器 xff0c eclipse作为一款知名的IDE自然是一个不错的选择 准备 eclipse依赖于JDK xff0c 所以我们在安装eclipse之
  • 安装codeblocks(win10)

    下载 进入http www codeblocks org downloads 26 xff0c 选择与你电脑对应的codeblocks版本 xff0c 这里以win10为例 xff0c 下载windows平台的codeblocks 注意要选
  • B - Palindrome-phobia(CODE FESTIVAL 2017 Final)

    题目链接 https cf17 final open contest atcoder jp tasks cf17 final b 解题思路 通过找规律发现出现的次数最多的字符与其他两个字符数量的差不能大于1 AC代码 include lt
  • poj1061青蛙的约会

    题目链接 http poj org problem id 61 1061 题目类型 扩展欧几里得算法 解题思路 设青蛙A为速度快的那只 xff0c 则有 m n t k l 61 y x 令a 61 m n b 61 l c 61 y c则
  • Android Studio中安装Kotlin插件

    http blog csdn net cto 1649900265 article details 72628878 这个链接内介绍了安装Kotlin插件的步骤 步骤 xff1a 在Android Studio中打开Settings xff
  • 骰子的游戏(牛客练习赛7)

    题目链接 https www nowcoder com acm contest 38 A 解题方法 枚举 AC代码 include lt stdio h gt const int maxn 61 10 43 5 int a maxn b m
  • C - Shopping Street(AtCoder Beginner Contest 080)

    题目链接 https beta atcoder jp contests abc080 tasks abc080 c 解题方法 因为一共只有十个时期所以我们可以枚举所有的状态 xff0c 又因为必须有1个时期开放 xff0c 所以我们从1而不
  • 经典OJ推荐

    转载自http acdream info topic tid 61 101 一 Online Judge简介 Online Judge系统 xff08 简称OJ xff09 是一个在线的判题系统 用户可以在线提交程序多种程序 xff08 如
  • 安装Tomcat(win10)

    引论 做web项目已经是一个很常见的事情了 xff0c 而我们完成后的web项目要想发布除了硬件的服务器外还需要相应的服务器软件 xff0c 而Tomcat就是一款web应用服务器 尽管因为Nginx xff08 它的性能是Apache服务
  • org.hibernate.InstantiationException: No default constructor for entity: cn.gov.entity.Book

    出错地方 xff1a org hibernate InstantiationException No default constructor for entity cn gov entity Book 出错原因 xff1a hibernat
  • 牛客练习赛8 D加边的无向图

    题目链接 https www nowcoder com acm contest 39 D 解题思路 利用并查集查找一共有几个独立的集合 xff0c 最后需要的最少边为集合个数减一 AC代码 include lt stdio h gt inc
  • 解决getHibernateTemplate().save ()不能将数据保存到数据库的问题

    原文出自http blog csdn net justerdu article details 50893583 分析 xff1a 数据是保存在缓存中而未提交到数据库中 解决办法 xff1a 在hibernate cfg xml里面加入 h
  • 输入ctrl s终端冻结怎么办

    原文出自http www xshellcn com zhishi sr ztd html 大家有没有发现每当输入ctrl s 就暂停该终端 让人着急万分 xff0c 我相信这是很多xshell的用户都会遇到的一个问题 xff0c 那应该怎么
  • java大数详解

    引论 在算法竞赛中我们经常遇到大数问题 xff0c 例如求一个很大的斐波那契数 住在这种情况下我们用常规解法 xff08 使用long long或long long int xff09 肯定是不行的 xff0c 而我们自己写一个大数的算法又
  • ACM数论模板及应用

    引论 数论是算法竞赛的宠儿 xff0c 几乎每个算法竞赛 xff08 不论是ACM的省赛 区域赛还是牛客网上的网络赛 xff09 都会出一道关于数论的题 这很容易理解 xff0c 因为算法与数学的关系极其密切 xff0c 也可以说算法拼到最
  • 深度神经网络的应用

    深度学习能应用在哪些领域 xff1f 深度学习的快速发展 xff0c 不仅使机器学习得到许多实际的应用 xff0c 还拓展了整个AI xff08 人工智能的 xff09 的范围 它将任务进行拆解 xff0c 使得各种类型的机器辅助变成可能
  • <操作系统>读者写者问题(写者优先)C语言实现

    问题描述 代码 span class token macro property span class token directive keyword include span span class token string lt stdio