【Linux】使用<信号量>实现<线程互斥>(思维导图&代码演示&思路解析)

前言

大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • 一.信号量的概念与语法
    • 1.信号量基本概念&类型&头文件
    • 2.信号量的基本操作【等待(P操作)& 释放(V操作)】
    • 3.信号量的基本函数【创建&销毁&等待(P操作)& 释放(V操作)】
  • 二.信号量实现线程互斥(用信号量实现两个线程互斥输出1-10数字)

引言:我们常规用< 互斥量(mutex)>可以实现线程互斥,还有另一种方式即< 信号量 >

一.信号量的概念与语法

1.信号量基本概念&类型&头文件

信号量可以根据其取值范围和用途进行分类,常见的类型包括:

  1. 整型信号量:信号量的值是整数,可以表示任意数量的资源。
  2. 记录型信号量: 除了包含一个整数值(表示可用资源的数量)外,还包含一个进程等待队列,用于存储阻塞在该信号量的各个进程的标识。
  3. 二进制信号量: 只允许信号量取0或1值。这种信号量通常用于实现互斥锁,保证只有一个进程或线程可以访问共享资源。
  • sem_t类型:
  1. 是POSIX线程库提供的一个 信号量类型
  2. sem_t类型的信号量可以模拟上述三类分类中的某些行为
sem_t s;//先定义,后面再初始化

头文件:

semaphore.h

基本概念:

  • 信号量: 表示可用资源的数量
  • 当进程或线程需要访问某个共享资源时,会先尝试获取信号量。如果信号量的值大于0,表示有资源可用,进程或线程可以获取信号量并访问资源,同时信号量的值会减1。如果信号量的值为0,表示没有资源可用,此时进程或线程会进入阻塞状态,等待其他进程或线程释放信号量

2.信号量的基本操作【等待(P操作)& 释放(V操作)】

信号量的操作通常包括两种:等待(P操作)和释放(V操作)。

  • 等待(P操作):【Park】 进程或线程 尝试获取 信号量。
    如果信号量的值大于0,则获取成功,信号量的值减1;
    如果信号量的值为0,则进程或线程进入阻塞状态 ,等待其他进程或线程释放信号量。
  • 释放(V操作):【Voke】 进程或线程 释放 之前获取的信号量。
    释放信号量时,该信号量的值会增加1。
    如果有进程或线程因为信号量的值为0而处于阻塞状态,此时会唤醒一个或多个阻塞的进程或线程。

3.信号量的基本函数【创建&销毁&等待(P操作)& 释放(V操作)】

semm_init(信号量.0,设置的信号量的初值);//创建信号量
sem_destroy(信号量);//销毁毁信号量
sem_wait(信号量);//等待P 操作
sem_pos(信号量)://释放V 操作

二.信号量实现线程互斥(用信号量实现两个线程互斥输出1-10数字)

要求:用信号量实现两个线程互斥输出1-10数字

解析:

  1. 把信号量初始化成1,表示目前可用资源为1
  2. 进入两个线程,其中第一个线程进入等待(P操作)后, 信号量-1变成0
  3. 第二个线程进入进入等待(P操作)后, 由于信号量变为0进入阻塞状态
  4. 第二个线程必须等到第一个线程执行完程序后, 进行释放V操作,释放信号量,信号量+1后,他才会解除阻塞状态
  5. 从而实现互斥操作,2个线程按照先后顺序

流程示意图:
在这里插入图片描述

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>sem_t s;//定义信号量
void* fun(void* param){long tnum=(long)param;int i;sem_wait(&s);//等待(P操作)parkfor(i=1;i<=10;i++){printf("thread%ld:%d \n",tnum,i);sleep(1);}sem_post(&s);//释放(V操作)vokeint main(){pthread_t tidi,tid2;sem_init(&s,0,1);//初始化成1pthread_create(&tid1,0,fun,(void*)0);pthread_create(&tid2,0,fun,(void*)1);pthread_join(tid1,0);pthread_join(tid2,0);sem_destroy(&s);return 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【A股小探-01】股指期货交割日对股指的影响

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为刘世宇&#xff0c;发布于2024年5月3日。 以下为精华帖正文&#xff1a; 01 引言 自踏入 A 股市场以来&#xff0c;笔者注意到了众多所谓的“效应”与“魔咒”&#xff0c;例如黑周四、黑四月、财报季魔咒、节前效…

ios 快捷指令扩展(Intents Extension)简单使用 swift语言

本文介绍使用Xcode15 建立快捷指令的Extension&#xff0c;并描述如何修改快捷指令的IntentHandler&#xff0c;带参数跳转主应用&#xff1b;以及展示多个选项的快捷指令弹框(配置intentdefinition文件)&#xff0c;点击选项带参数跳到主应用的方法 创建快捷指令 快捷指令是…

技术干货|如何巧妙利用数字孪生技术助力口腔保健分析

行业&#xff1a; 口腔医疗 挑战&#xff1a; 传统方法缺乏预测口腔内受力状态&#xff0c;也很难从患者方面获得反馈&#xff0c;因此将口腔扫描、牙齿形状/位置识别和正畸数字模型生成的过程数字化是一个重大机会。 正畸治疗是牙科中最大的类别之一&#xff0c;随着病例的…

星巴克们需要找回节奏

“重返星巴克”需要更多运气。 作者|金豫 编辑|杨舟 国内咖啡市场正上演着一场后浪推前浪的经典剧目。 近期&#xff0c;“太平洋咖啡”传出大规模关店的消息。该品牌在多座城市中仅剩下几家门店&#xff0c;且多数集中在机场。而在2016年前后&#xff0c;太平洋咖啡一度超越…

React 前端框架全面教程:从入门到进阶

React 前端框架全面教程&#xff1a;从入门到进阶 引言 在现代前端开发中&#xff0c;React 作为一款流行的 JavaScript 库&#xff0c;以其组件化、声明式的特性和强大的生态系统&#xff0c;成为了开发者的首选。无论是构建单页应用&#xff08;SPA&#xff09;还是复杂的用…

【力扣 + 牛客 | SQL题 | 每日4题】牛客大厂面试真题W3,W10

1. 牛客大厂面试真题SQLW3&#xff1a;分析客户逾期情况 1.1 题目&#xff1a; 描述 有贷款信息表&#xff1a;loan_tb&#xff08;agreement_id&#xff1a;合同id&#xff0c;customer_id&#xff1a;客户id&#xff0c;loan_amount&#xff1a;贷款金额&#xff0c;pay_a…

在 Windows 中使用 GCC 编译运行 C++

在 Windows 中使用 GCC 编译开发 C 通过 MSYS2 安装 MinGW 工具链 MSYS2&#xff08;Minimal SYStem 2&#xff09;是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于 Linux 的shell环境&#xff0c;可以在 Windows 系统中编译和运行许多 Linux 应…

铝基板PCB创建助手

支持在创建元件时创建网表 支持圆形和矩形阵列布局 支持板框信息修改 支持缺口位置修改 支持元件封装预览 支持原理图预览 支持PCB板框和布局预览 支持灯珠方向更改为切向和径向 支持报告输出 支持元件封装选择 铝基板PCB创建助手 V1.0

如何理解全局和局部的规律

再和大家聊的话题是全局和局部的辩证关系。 研究全局和局部的辩证关系&#xff0c;研究的就是做事的方法。 不过这里说的做事的方法不是具体的执行办法&#xff0c;比如这一步应该怎么做&#xff0c;那一步应该怎么做。 而是重在思考&#xff0c;应该先做什么&#xff0c;后…

GPT-Sovits-2-微调模型

1. 大致步骤 上一步整理完数据集后&#xff0c;此步输入数据, 微调2个模型VITS和GPT&#xff0c;位置在 <<1-GPT-SoVITS-tts>>下的<<1B-微调训练>> 页面的两个按钮分别执行两个文件: <./GPT_SoVITS/s2_train.py> 这一步微调VITS的预训练模型…

【LeetCode】两数之和、大数相加

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO 1.两数之和 题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一…

根据输入的详细地址解析经纬度

摘要&#xff1a; 今天遇到一个需求&#xff1a;就是做客户导入的时候因为导入的客户地址的时候没有经纬度的&#xff0c;但是同步的时候需要经纬度的&#xff0c;所以还是要根据客户提供的详细地址解析出来对应的经纬度&#xff01;回填到对应的经纬度的表单之中进行客户的同步…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款旅游类智能体的开发,来体验一下我的智能体『​​​​​​​背包客』

&#x1f680;『背包客』点击前往体验&#xff1a;https://mbd.baidu.com/ma/s/d7RHMlWh 最近参加了百度文心智能体平台AI大师工坊&#x1f389;活动&#xff0c;在这个活动中&#xff0c;我利用文心平台提供的各种插件、大模型等工具&#xff0c;打造了一个工具类的智能体应用…

WPF的触发器(Trigger)

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软.NET框架的一部分&#xff0c;用于构建Windows客户端应用程序。在WPF中&#xff0c;触发器&#xff08;Triggers&#xff09;是一种强大的功能&#xff0c;允许开发者根据控件的状态或属性值来动态改变控件的…

ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算——从0基础到15个案例实战应用

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录 一、根本原因 二、解决方案 一、根本原因 Oracle数据库新增数据的时候报如下错误&#xff1a; 先给大家看个小案例&#xff0c;这样更好去理解&#xff0c;下面是一段测试代码&#xff1a; 这里面我分别列举了三种字符串&#xff0c;中文&#xff0c;英文和数字以及两种…

动态规划 —— 路径问题-礼物的最大价值

1. 剑指offer-JZ47-路径问题-礼物的最大价值 题目链接&#xff1a; 礼物的最大价值_牛客题霸_牛客网https://www.nowcoder.com/practice/2237b401eb9347d282310fc1c3adb134?tpId265&tqId39288&ru/exam/oj 2. 算法原理 状态表示&#xff1a;以莫一个位置位置为结尾 d…

安装git-lfs发生报错Could not find Git; can not register Git LFS.解决方案

解决方案&#xff1a; 步骤1.安装Github-Deskop Download GitHub Desktop | GitHub Desktophttps://desktop.github.com/download/ 步骤2.安装 Git&#xff01; Git for WindowsWe bring the awesome Git VCS to Windowshttps://gitforwindows.org/ 这两个安装完成之后即可…

Unity hub登录时一直无法进入license

直接只卸载unity hub&#xff0c;然后重新下载unity hub安装即可&#xff0c;重新登录即可。 有时会自动关联安装的位置&#xff0c;如果不能&#xff0c;则手动定位添加即可。 网上各种修复的方法操作费时费力。

three.js使用ShaderMaterial实现聚光灯光源demo

文章目录 顶点片元全部 核心&#xff1a; 顶点 varying vec3 vNormal;varying vec3 vViewPosition;void main() {vNormal normalMatrix * normal;vNormal normalize( vNormal );vec4 modelViewPosition modelViewMatrix * vec4(position, 1.0);gl_Position projectionMat…