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

Linux 应用程序信号量使用实战

背景

在项目实施过程中,有个机制需要做两个线程之间的同步。

具体需求如下:

首先,线程1需要把资源读取到缓存

其次,线程2才可以操作这块缓存

上述两个动作顺序交替重复。

思路

使用信号量解决思路,申请两个信号量,具体流程如下所述:

申请两个信号量,其中信号量1初始化为无信号,信号量2初始化为有信号

线程1首先申请信号量2的信号,有信号后,线程1把资源读取到缓存后,才释放信号量1

线程2首先申请信号量1的信号,有信号后,线程2操作完这块缓存后,才释放信号量2

代码

具体代码如下:

头文件

#include <semaphore.h>

定义全局信号量

sem_t sem1;
sem_t sem2;

初始化信号量,这里信号量2申请为有信号状态

    ret = sem_init(&sem1, 0, 0);if (ret == -1) {printf("sem1_init failed \n");return -1;}ret = sem_init(&sem2, 0, 1);if (ret == -1) {printf("sem2_init failed \n");return -1;}

线程1首先申请信号量2的信号,有信号后,线程1把资源读取到缓存后,才释放信号量1

void* thread1(void *res)
{while (1) {sem_wait(&sem2);//开始写入保护的内存数据xxxxxxxxxx//结束写入保护的内存数据sem_post(&sem1);}
}

线程2首先申请信号量1的信号,有信号后,线程2操作完这块缓存后,才释放信号量2

void* thread2(void *res)
{while (1) {sem_wait(&sem1);//开始读出保护的内存数据xxxxxxxxxx//结束读出保护的内存数据sem_post(&sem2);}
}

上述基本上表述了,针对内存的保护,不知道说清楚了没有。表述应该还算明白

线程申请信号,不能一直等待,需要超时处理,我这超时设置时毫秒级别,时间比较长

具体代码如下,设置500ms超时等待

struct timespec ts;clock_gettime(CLOCK_REALTIME, &ts);ts.tv_nsec += 500*1000*1000;sem_timedwait(&sem,&ts);

信号量的一些基本概念

信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:

(1)P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

(2)V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

在信号量进行PV操作时都为原子操作(因为它需要保护临界资源)

注:原子操作:单指令的操作称为原子的,单条指令的执行是不会被打断的

相关文章:

Linux 应用程序信号量使用实战

背景 在项目实施过程中&#xff0c;有个机制需要做两个线程之间的同步。 具体需求如下&#xff1a; 首先&#xff0c;线程1需要把资源读取到缓存 其次&#xff0c;线程2才可以操作这块缓存 上述两个动作顺序交替重复。 思路 使用信号量解决思路&#xff0c;申请两个信号…...

【Java多线程进阶】synchronized工作原理

前言 本期讲解 synchronized 工作的原理以及常见的锁优化机制&#xff0c;相信大家在看完这篇博文后对 synchronized 工作流程有一定的理解。话不多说&#xff0c;让我们快速进入学习吧~ 目录 1. 锁的工作流程 2. 偏向锁 3. 轻量级锁和重量级锁 3.1 轻量级锁 3.2 重量级锁…...

C语言经典题目(三)

C站的小伙伴们&#xff0c;大家好呀&#xff01;&#x1f60a;&#x1f60a;✨✨这一篇是C语言之经典题目篇&#xff0c;除程序设计&#xff0c;还有一些不错的程序分析&#xff0c;快来和我一起进入C语言的世界吧&#xff01;✨✨✨ &#x1f495;C语言其他刷题篇在这里哦&…...

九、(补充文章四)Arcgis实现深度学习训练样本数据的批量制作——只靠原图+shp如何批量制作样本图片

之前写了一些个深度学习系列文 其中先是单张样本的制作方法 最后通过构造模型批量处理 大大提高了生成样本的速度 四、Arcgis实现深度学习河流训练样本数据的制作(使用软件批量获取样本图片)——对已经获取到的完整面状样本数据进行处理 但是这个方法不仅仅需要shp和原图 还需要…...

MKS SERVO4257D 闭环步进电机_系列8 CAN通讯示例

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&a…...

UnityVR--组件9--视频组件VideoPlayer

目录 前言 参数解释 RenderMode渲染方式 VideoPlayer类中的API 前言 在之前的VR场景中已经使用过VideoPlayer播放视频&#xff08;Unity.UI的交互&#xff08;6&#xff09;-播放视频&#xff09;&#xff0c;不过在VR中设置是有些不同的&#xff0c;这里更详细地说明一下V…...

Java 深拷贝和浅拷贝

Java 中的深拷贝和浅拷贝是针对对象复制而言的。 浅拷贝&#xff08;Shallow Copy&#xff09; 当对象进行浅拷贝时&#xff0c;只会复制对象本身和其中的基本数据类型属性&#xff0c;而不会复制引用对象的实际内容。具体而言&#xff0c;浅拷贝只会创建一个新的对象&#x…...

[ruby on rails] docker

docker安装 ubuntu14.04后自带docker安装包&#xff0c;可以直接安装 sudo apt-get updatesudo apt-get install -y docker.io# 安装后启动sudo service docker start查看docker信息 docker infodocker命令 sudo service docker start sudo service docker stop sudo servic…...

网络协议——STP协议是什么?是如何实现的?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、STP协议是什么 二、为什么需要STP协议 三、STP的实现过程 ​编辑 1、选举跟桥 2、给非跟桥交换机选举跟端口 3、给每个网段选…...

【C++】智能指针 学习总结 |std::shared_ptr |std::unique_ptr | std::weak_ptr

文章目录 前言一、智能指针介绍二、普通指针和智能指针的比较案例三、std::shared_ptr四、std::unique_ptr五、std::weak_ptr六、std::shared_ptr |std::unique_ptr | std::weak_ptr三大智能指针的区别 前言 参考答案&#xff1a;chatgpt 一、智能指针介绍 智能指针是C的一种…...

iptables防火墙

文章目录 一.linux防火墙基础1.linux 包过滤防火墙概述1.1netfilter1.2 iptables 2.包过滤的工作层次2.1 通信的五元素和四元素 3.iptables 的表、链结构3.1 规则链3.2 默认包括5种规则链3.3 规则表3.4 默认包括4个规则表 二.数据包过滤的匹配流程1.规则表之间的顺序2.规则链之…...

properties、yaml作为配置文件的特点

说明&#xff1a;在软件开发中&#xff0c;经常需要把一些配置写在文件中&#xff0c;如数据库配置、MyBatis配置等。这样&#xff0c;后续如果数据库参数有改动&#xff0c;就可以避免直接对代码做修改&#xff0c;只要修改配置文件中关于数据库的配置。关于配置文件的选择&am…...

JavaSE-03 【流程控制语句】

文章目录 JavaSE-03 【流程控制语句】第一章 流程控制1.1 流程概述1.2 顺序结构 第二章 判断语句2.1 判断语句---if2.2 判断语句---if...else2.3 判断语句---if...else if ... else 第三章 选择语句3.1 选择语句--switch3.2 case的穿透性 第四章 循环语句4.1 循环概述4.2 循环语…...

笔记本电脑的BIOS是怎么保护安全的?

随着攻防技术的不断演进&#xff0c;像BIOS攻击、高级网络代码攻击等手段层出不穷&#xff0c;“受害者”也不仅限于企业级服务器、存储&#xff0c;很多魔爪也开始伸向了拥有商业机密数据的PC。 BIOS是Basic Input/Output System&#xff08;基本输入/输出系统&#xff09;的…...

Xubuntu之将rm删除内容移至回收站(一百七十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

STM32F407实现1588v2(ptpd)

硬件&#xff1a; STM32F407ZGT6开发板 软件&#xff1a; VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example&#xff0c;因为和F407差别很小&#xff0c;所以就打算用这个demo移植到手头的开发板上。因为目前只需要…...

架构师如何找到自己的商业模式

作为一个架构师&#xff0c;必须要在有限的资源下最大化架构活动所带来的商业价值。对于任何一个架构活动而言&#xff0c;架构师的可用资源&#xff0c;包括商业成本、研发成本、时间成本、迁移成本等等&#xff0c;都是非常有限的。但架构活动就是要在这些限制条件之下&#…...

SQLServer2022安装(Windows),已验证

一、SQLServer2022下载 1、官网下载地址 SQL Server 下载 | Microsoft 2、下载安装包 2.1、选择Developer版本&#xff0c;立即下载。 2.2、打开下载文件夹&#xff0c;双击运行SQL2022-SSEI-Dev.exe 尝试运行SQL2022-SSEI-Dev.exe&#xff0c;会收到以下信息&#xff1a;“…...

facenet, dlib人脸识别,人体检测,云数据库mysql,QQ邮箱,手机验证码,语音播报

目录 部分代码展示&#xff1a; 录入部分 识别部分​编辑 活体检测部分​编辑 同步到云数据库MySQL 其他操作 部分图片展示&#xff1a; 完整代码加ui链接&#xff1a; 涉及到的一些知识点的文章 部分代码展示&#xff1a; 录入部分 识别部分 活体检测部分 同步到云数…...

Spring Boot 面试题——定时任务

目录 1.什么是 cron 表达式&#xff1f;如何使用&#xff1f;2.Scheduled 注解有什么作用&#xff1f;3.介绍一下 spring-boot-starter-quartz。4.在 Spring Boot 中如何实现定时任务&#xff1f;4.1.使用 Schedule 注解4.2.Quartz 框架 1.什么是 cron 表达式&#xff1f;如何使…...

总建面64万平,配3所幼儿园+54班九年制学校,坪山江岭竹元规划

近日&#xff0c;坪山区城市更新和土地整备局发布&#xff0c;关于《坪山区马峦街道江岭竹元片区城市更新单元规划》已通过深圳市城市规划委员会法定图则委员会审批。现予以公告。 项目位于坪山区马峦街道&#xff0c;南邻南坪快速路&#xff0c;北邻比亚迪路&#xff0c;东西两…...

python3 爬虫相关学习7:使用 BeautifulSoup下载网页图片到本地文件夹

目录 1 一个爬图片pic的代码的例子 1.1 学习的原文章 1.2 原始代码的问题总结 问题1 问题2 问题3 其他问题 1.3 原始代码 2 直接在cmd里 python运行报错 和 处理 2.1 运行报错 2.2 报错原因&#xff1a; 没有提前安装这个bs4 模块 2.3 如何提前知道我的python环境…...

windows平台python脚本执行环境搭建笔记

1.python脚本环境下载 这里是原始发布源&#xff1a; https://www.python.org/downloads/release/python-3114/https://www.python.org/downloads/release/python-3114/安装时记得添加进系统path&#xff0c;这样你可以随时调用python环境。 2.扩展模块的安装 step1.找到py…...

MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法

MyBatis的动态SQL 1、if标签的用法2、choose标签的用法3、where标签4、set标签5、trim的用法6、foreach标签7、bind标签 使用过JDBC或者是其他的ORM框架的开发者都知道&#xff0c;在很多操作中都需要去根据具体的条件进行SQL语句的拼接&#xff0c;并且在有些时候一些标点符号…...

基于Java+Springboot+Vue的二次元商城网站设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…...

MyBatis操作数据库实现

说明&#xff1a;MyBatis是作用于三层架构开发&#xff0c;数据访问层&#xff08;Data Access Object&#xff09;的框架&#xff0c;用于访问数据库&#xff0c;对数据进行操作。 一、环境搭建 首先&#xff0c;创建一个SpringBoot模块&#xff0c;然后把MyBatis的环境搭建…...

Git GitLab 使用及规范

Git 基本操作 Git安装配置及基本使用 从官网下载安装包&#xff0c;手动完成安装。打开Git Bash命令行工具&#xff0c;执行命令ssh-keygen -t rsa -C Email-Addresss生成一个密钥对。登录到GitLab&#xff0c;点击右上角你的用户头像&#xff0c;点击Edit Profile settings&…...

【SpringCloud——Sentinel】

一、什么是雪崩&#xff1f; 微服务调用链路中的某个服务发生故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。 二、解决雪崩问题的常见措施 1、超时处理 设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息&#xff0c;不会无休…...

面试专题:计算机网络常见面试点总结

socket、tcp、udp、http 的认识及区别 socket、tcp、udp、http 的认识及区别​ 一、先来一个讲TCP、UDP和HTTP关系的 1、TCP/IP是个协议组&#xff0c;可分为三个层次&#xff1a;网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传…...

PageHelper失效问题

问题出现记录&#xff1a; 修改代码后&#xff0c;出现分页失效问题&#xff0c;原本的代码再设置了 PageHelper.startPage(pageNum, pageSize);后只有一个mysql查询&#xff0c;我在原本的业务查询前&#xff0c;新增了其他的Mysql查询&#xff0c;导致原需要分页的查询失效 …...

网站开发需要考虑哪些方面/seo人才网

json-server获取服务器数据只能用get方式&#xff0c;而express支持post方式获取数据 express 一般项目中均安装&#xff0c;若未安装 npm install express --savebuild文件夹webpack.dev.config.js添加设置 //支持post mock数据 var express require(express); //启动expr…...

绿色风格的网站/网店运营具体做什么

1一、课题研究的现实背景及意义(一)研究背景1&#xff0e;我国中职教育发展的新形势&#xff0c;指出了中职语文教学结合专业进行改革的重要性教育部在《关于全面推进素质教育深化中等职业教育教学改革的意见》1中指出&#xff1a;“加强文化基础教育&#xff0c;改革文化基础课…...

山东网站建设都有那些/如何在各种网站投放广告

本文实例讲述了静态页面html中跳转传值的JS处理技巧。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在html中通过"?"传值&#xff1a;静态传值在跳转到的页面index2.html中接收&#xff1a;var nameUrlParm.parm("name");代码如下&#xff1a;in…...

网站建设作者墙这个模板/seo内容优化是什么意思

Linux hosts.allow与hosts.deny文件设置 转自&#xff1a; http://purpen.iteye.com/blog/1135342 redhat as4常用应用之hosts.allow和hosts.deny 一、概述 这两个文件是tcpd服务器的配置文件&#xff0c;tcpd服务器可以控制外部IP对本机服务的访问。这两个配置文件的格式如下&…...

网站制作便宜/网站建设的整体流程有哪些

replace 语法 stringObj.replace(rgExp, replaceText) replace 方法的语法包括下述部分&#xff1a; 部分 描述 stringObj 必选项。要执行该替换的 String 对象或文字。该对象不会被 replace 方法修改。 rgExp 必选项。描述要查找的内容的一个正则表达式对象。 replaceText…...

专业建站公司服务/关键词排名提升工具

这是一个基于MVCDAO的留言管理系统&#xff0c;包含增删改查&#xff0c;其中查询&#xff0c;有全部查询和按关键字进行模糊查询的功能。文章底部附件是源码程序。大家共同学习&#xff0c;共同进步。具体如下&#xff1a; NoteDAO.java package cn.mldn.lxh.note.dao ;import…...