线程的同步和互斥

2023-11-11

线程的同步和互斥题目

题目:
设计生产者与消费者模型,缓冲区是一个大小为10的环。每个生产者产生一个0-1000的随机整数,存放在环空位中,消费者从环中取数据,并输出。一个生产者或消费者对应一个线程。
要避免:
(1)两个生产者同时向环的同一个位置放数据
(2)两个消费者同时从环的同一个位置取数据
(3)一个生产者和一个消费者同时分别对环的同一个位置进行放数据和取数据。
这题主要考的是线程的同步和互斥,主要涉及的PV操作思想是这样的
PV操作

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define N 10

sem_t avail,ready;
sem_t mutex;
int buf[N];
int inpos=0,outpos=0;//数据输出

void Thread_Pi();//生产者
void Thread_Ci();//消费者
void sbuf_insert(buf);//数据插入
int sbuf_remove(buf);//数据输出
int main(){
        pthread_t tid1,tid2;
        //信号量初始化
        sem_init(&avail,0,N);//avail代表缓冲区个数
        sem_init(&ready,0,0);//ready代表已经存有数据的缓冲区个数
        sem_init(&mutex,0,1);//mutex代表对缓冲区的操作

        //创建线程
        pthread_create(&tid1,NULL,Thread_Pi,NULL);
        pthread_create(&tid2,NULL,Thread_Ci,NULL);

        //回收已终止线程的资源
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);

        //销毁信号量
        sem_destroy(&mutex);
        sem_destroy(&avail);
        sem_destroy(&ready);

        //结束进程
        exit(EXIT_SUCCESS);
}
void Thread_Pi(){
        int item;
        while(1){
                item=rand()%1000;//取随机数
                sem_wait(&avail);//P操作,查看是否有空闲的缓冲区
                sem_wait(&mutex);//获取缓冲区控制权
                sbuf_insert(item,buf);//插入数据
                sem_post(&mutex);//V操作
                sem_post(&ready);//有数据的缓冲区+1
                printf("生产者在%d位置放入了数据%d\n",inpos,item);
                sleep(1);
        }
}

void Thread_Ci(){
        int item;
        while(1){
                sem_wait(&ready);//P操作^[OB
                sem_wait(&mutex);
                item=sbuf_remove(buf);//取出数据
                sem_post(&mutex);//V操作
                sem_post(&avail);
                printf("消费者在%d位置取出了数据%d\n",outpos,item);
                sleep(1);
        }
}
//插入数据
void sbuf_insert(int item,int buf[]){
        buf[inpos]=item;
        inpos=(inpos+1);
        inpos=(inpos)%N;
}
//取出数据顺便将那个位置的数字置为-1
int sbuf_remove(int buf[]){
        int item;
        item=buf[outpos];
        outpos=(outpos+1)%10;
        buf[outpos]=-1;
        return item;
}


运行结果如下
运行结果
这只是一个很简单的实现,我只是记录下来方便以后查看。

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

线程的同步和互斥 的相关文章

  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • 远程linux服务器到远程linux服务器大型稀疏文件复制 - 如何?

    我有两台 CentOS 5 4 服务器 每台服务器上都安装了 VMware Server 假设我始终对 vmware 虚拟机使用稀疏文件 将虚拟机文件从一台服务器复制到另一台服务器的最可靠 最快速的方法是什么 虚拟机的文件复制起来很痛苦 因
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 为什么 ld 无法从 /etc/ld.so.conf 中的路径找到库?

    我想添加 opt vertica lib64进入系统库路径 所以我执行以下步骤 1 添加 opt vertica lib64 into etc ld so conf 然后运行ldconfig 2 检查 bash ldconfig p gre
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理

随机推荐

  • 股市中的内盘、外盘、跌幅、震幅、现手、总手、换手是什么意思?

    外盘即买盘 内盘即卖盘 内盘即卖盘要卖掉 有人买就以这个成交价设为买入价 外盘即买盘要买进 有人卖就以这个成交价设为卖出价 总手就是成交量 1个交易日的买卖总量 即等于外盘 内盘 成交量 总手 量比 在查看分时走势图时候 可根据右键菜单选择
  • hadoop3.0.3搭建与入门(添加删除;调度-节点)

    hadoop版本 apache cloudera CDH版 Hortonworks HDP版 国内对CDH用的多 一般用3 0 单机版 scp hadoop 3 0 3 tar gz jdk 8u181 linux x64 tar gz s
  • 递归算法(二分查找)

    递归也算循环的一种 递归 你打开面前这扇门 看到屋里面还有一扇门 你走过去 发现手中的钥匙还可以打开它 你推开门 发现里面还有一扇门 你继续打开它 若干次之后 你打开面前的门后 发现只有一间屋子 没有门了 然后 你开始原路返回 每走回一间屋
  • RNN循环神经网络的Matlab模拟和训练

    RNN循环神经网络的Matlab模拟和训练 循环神经网络 RNN 是一种适用于序列数据的神经网络 RNN 在处理时间序列数据方面非常适用 如自然语言处理 股票价格预测等 本文将介绍如何使用 Matlab 来进行 RNN 的模拟和训练 在 M
  • 大O表示法及旅行者问题

    算法的运行时间 运行时间增速 不同算法随规模的增大而增大的速度不同 我们需要比较不同算法的运行时间的增速 大O表示法 类比数据结构中的时间复杂度 比较操作数 其体现了算法运行时间的增速 这种表示法体现了算法在最糟情况下的运行时间 这不就是时
  • 全新升级!讯飞星火认知大模型V2.0,你准备好了吗?

    前言 AI大模型正在全球掀起新一轮的技术革命与商业浪潮 从技术突破到应用落地 加速改变着我们的生活与产业 依托通用人工智能领域的持续深耕和系统性创新 科大讯飞于5月6日正式发布星火认知大模型 并于6月9日迅速完成迭代升级 受到用户持续好评
  • 软件测试环境的搭建

    前言 测试环境是QA开展测试工作的前置条件 稳定和可控的测试环境 可以使测试人员在执行测试用例时无需花费额外的时间去维护 有些公司运维或者研发部门会帮忙准备好测试环境 但是QA如果一味依赖其他部门 会局限测试工作的开展 一 什么是测试环境
  • 【PASS】析因设计样本量计算

    b站视频 working
  • 软件设计和硬件开发 部分学习网站

    1 单片机教程网 http www 51hei com 2 博客园 https www cnblogs com 3 各种程序语言基础知识 https www runoob com cprogramming c scope rules htm
  • Linux运维基础--常见命令

    Linux运维基础 常见命令 linux的发行版本介绍 Linux 内核 kernel 版本主要有 4 个系列 分别为 Linux kernel 2 2 Linux kernel 2 4 Linux kernel 2 6 Linux ker
  • 贪心——字典序最小问题

    https vjudge net problem POJ 3617 题目简单理解就是 给定长度为N的字符串为S 要构造一个长度为N的字符串T 起初 T 是一个空串 随后反复进行下列任意操作 从S的头部删除一个字符串 加到T的尾部 从S的尾部
  • 教与学(TlBO)算法路径规划应用

    是一种基于群体的启发式优化算法 不需要任何算法特定参数 这种方法模拟了传统的课堂教学过程 整个优化过程包括教师阶段和学习者阶段 在教师阶段 每个学生都向最优秀的个体进行学习 在学习阶段 每个学生都以随机的方式向其他学生学习
  • k8s--基础--23.3--认证-授权-准入控制--授权

    k8s 基础 23 3 认证 授权 准入控制 授权 1 介绍 Kubernetes的授权是基于插件形式的 其常用的授权插件有以下几种 1 Node 节点认证 2 ABAC 基于属性的访问控制 3 RBAC 基于角色的访问控制 4 Webho
  • 在IDEA中用jdbc技术通过配置文件连接mysql数据库连接池

    File gt project Structure gt Libraries gt 点 号 gt java gt 选择在电脑中下载druid 1 1 9 jar及以上版本的德鲁伊jar包和mysql connector java 8 0 0
  • MySQL-锁详解

    锁 锁是计算机协调多个进程或线程并发访问某一资源的机制 在数据库中 除传统的计算资源 如CPU RAM I O等 的争用以外 数据也是一种供许多用户共享的资源 如何保证数据并发访问的一致性 有效性是所有数据库必须解决的一个问题 锁冲突也是影
  • 算法刷题-双指针-反转链表

    反转链表的写法很简单 一些同学甚至可以背下来但过一阵就忘了该咋写 主要是因为没有理解真正的反转过程 206 反转链表 力扣题目链接 题意 反转一个单链表 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL 输出 5 gt
  • fork() 函数

    请问下面的程序一共输出多少个 int main void int i for i 0 i lt 2 i fork printf return 0 答案 8 解析 参考文章 https coolshell cn articles 7965 h
  • Ubuntu 18.04 安装Tensorflow遇到的问题

    问题一 Tensorflow安装完成后测试时 出现libcublas so 9 0找不到问题 ImportError libcublas so 9 0 cannot open shared object file No such file
  • uni-app 数据上拉加载更多功能

    实现上拉加载更多 打开项目根目录中的 pages json 配置文件 为 subPackages 分包中的商品 goods list 页面配置上拉触底的距离 subPackages root subpkg pages path goods
  • 线程的同步和互斥

    线程的同步和互斥题目 题目 设计生产者与消费者模型 缓冲区是一个大小为10的环 每个生产者产生一个0 1000的随机整数 存放在环空位中 消费者从环中取数据 并输出 一个生产者或消费者对应一个线程 要避免 1 两个生产者同时向环的同一个位置