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

Linux--多线程(3)

目录

    • 1. POSIX信号量
      • 1.1 概念
    • 2. 基于环形队列的生产消费者模型
      • 2.1 环形队列的基本原理
      • 2.2 基本实现思想
    • 3. 多生产多消费

1. POSIX信号量

1.1 概念

信号量本质是一个计数器,申请了信号量以后,可以达到预定临界资源的效果。

POSIX信号量和SystemV信号量相同,都可以用于同步操作,达到无冲突访问共享资源的目的。但POSIX可以用于线程间同步。

在未加锁情况下,如果多个线程同时对临界资源进行访问操作,是极度不安全的,所以想要实现多个线程并发,需要有信号量的申请。

每个线程申请了信号量以后,相当于对一块临界资源进行了预定,并且将其分成一个个小资源,每个线程同时访问该临界资源不同区域,达到多线程并发的效果。

对于每个线程来说,想访问临界资源。都必须先申请信号量资源,这就涉及到了信号量的数目多少。

  • P、V操作

这个过程其实就是对信号量进行加加减减。申请信号量的过程有成功或者失败,成功就是count–,失败就是挂起等待,即P操作;释放信号量就是count++,即V操作。

  • PV操作的原子性实现

PV操作的原子性其实是对于其他PV操作而言的,即一个P或V操作不能被其他的PV操作给打断,即需要实现PV操作的互斥。那么我们可以把PV操作的代码当成临界区,保证只有一个进程能访问临界区即可。实现对临界区资源的互斥访问的方法有很多种,比如Peterson算法,禁用中断,加锁等等等

  • 信号量的优缺点

优点:简单,表达能力强,用PV操作可以解决多种类型的同步/互斥问题
缺点:不够安全,PV操作使用不当容易产生死锁,遇到复杂同步互斥问题实现复杂

  • 初始化信号量:

在这里插入图片描述

参数:

pshared:0表示线程间共享,非零表示进程间共享
value:期望申请的信号量初始值

  • 销毁信号量:

在这里插入图片描述

  • 等待信号量:

功能:等待信号量,会将信号量的值减1

在这里插入图片描述

这其实是申请信号量的函数:

是经典的P操作,在申请信号量的过程中有重要作用。

  • 发布信号量:

功能:发布信号量,表示资源使用完毕,可以归还资源了,将信号量值加1

在这里插入图片描述

这个便是V操作,和V操作形成对比。

2. 基于环形队列的生产消费者模型

2.1 环形队列的基本原理

多线程的情况下,实现一个基于环形队列的生产消费模型,来进行环形队列的并发访问。

  1. 生产者和消费者开始的时候,指向的就是同一个位置;在队列为满的时候,也指向同一个位置。
  2. 队列为空的时候,应该让生产者先访问;队列为满的时候,应该让消费者先访问。

所以,当队列既不为空又不为满的时候,生产者和消费者一定指向的不是同一个位置。

那么我们就可以利用这个原理,在生产者和消费者不处于同一位置,那么久说明多个执行流访问的是临界资源的不同区域,就可以实现并发。 但是这个工作是程序员本身完成的,而不是信号量设置好的。

2.2 基本实现思想

对于生产者来说,最关心的资源应该是环形队列中空的位置;对于消费者来说,最关心的资源应该是环形队列中有数据的位置,其实就是资源存在的位置。

在这个模型中,要遵守几个规则:

  1. 生产者不能把消费者套一个圈,也就是说最多生产一圈,消费者就要行动了。

  2. 消费者不能超过生产者

  3. 当指向同一个位置的时候,要根据空、满的状态来判定谁先执行

  4. 除此之外,生产和消费可以并发执行

对于生产者来说,我们申请格子资源,格子资源变少了,其实就是对格子资源做P操作,那么可以放的数据资源更多了,那此时也就相当于对数据资源做V操作;消费者同理。

所以可以通过释放对方资源的方式来达到数据交互的效果。

3. 多生产多消费

如果想实现多生产者和多消费者同时工作,是必须要加锁的,而这个加锁的地方,是放在P操作之后。

生产者函数如下(消费者函数同理):

void PutData(const int &data)
{sem_wait(&space_sem); // Ppthread_mutex_lock(&_mtx_);//加锁q[consume_step] = data;consume_step++;consume_step %= cap;pthread_mutex_unlock(&_mtx_);//解锁sem_post(&data_sem); //V
}

举个例子:如果想要实现并发,如果将锁放在了P操作之前,就会造成PV操作之前都必须要申请到锁的情况,这其实和单线程没有区别,并且申请到了锁以后,PV操作如果不成功,还是需要从新来申请锁,所以效率也会更慢。

而放在P操作之后,可以理解为在申请锁之前,多个线程就已经申请到了信号量,即PV操作是成功的。那么此时只需要等待竞争锁就行了。

而这里正是多生产多消费的优势,每次都只能一个线程生产,一个线程消费,可以并发地获取和处理任务。

相关文章:

Linux--多线程(3)

目录1. POSIX信号量1.1 概念2. 基于环形队列的生产消费者模型2.1 环形队列的基本原理2.2 基本实现思想3. 多生产多消费1. POSIX信号量 1.1 概念 信号量本质是一个计数器,申请了信号量以后,可以达到预定临界资源的效果。 POSIX信号量和SystemV信号量相同…...

【spring】事务

概述 1、什么事务 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操 作都失败 2、事务四个特性(ACID) (1)原子性 (2)一致性 (3…...

博通仍然是美股市场最好的芯片半导体股

来源:猛兽财经 作者:猛兽财经 博通(AVGO)是一家快速增长的半导体公司,并且有很高的股息分红,目前其股息收益率已经高出了平均水平3.2%,而且估值非常合理,仅为预期净利润的14倍。 虽然博通也受到了经济衰退影…...

java开发手册之异常日志

文章目录异常日志异常处理日志规约异常日志 异常处理 1.Java 类库中定义的一类 RuntimeException可以通过预先检查进行规避,而不应该通过 catch 来处理 比如:IndexOutOfBoundsException,NullPointerException 等等。 说明:无法通…...

P6专题:关于P6 EPPM和PPM的区别及选型

目录 引言 什么是 Primavera P6 项目管理? Primavera P6 PPM 关键点 Primavera P6 PPM 是独立工具还是企业工具? 什么是 Primavera P6 企业项目组合管理? 那么EPPM的windows-tool呢? P6 EPPM 适合谁? 更多对比…...

亿万级海量数据去重软方法

文章目录原理案例一需求:方法案例二需求:方法:参考原理 在大数据分布式计算框架生态下,提升计算效率的方法是尽可能的把计算分布式话、并行化,避免单节点计算过载,把计算分摊到各个节点。这样解释小白能够…...

记录--手摸手带你撸一个拖拽效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近看见一个拖拽效果的视频(抖音:艾恩小灰灰),看好多人评论说跟着敲也没效果,还有就是作者也不回复大家提出的一些疑问,本着知其然必要知其所以然…...

python高德地图+58租房网站平台源码

wx供重浩:创享日记 对话框发送:python地图 免费获取完整源码源文件说明文档配置教程等 在PyCharm中运行《高德地图58租房》即可进入如图1所示的高德地图网页。 具体的操作步骤如下: (1)打开地图网页后,在编…...

ubuntu 将jupyter-lab保存为桌面快捷方式和favourites

ubuntu: 将jupyter-lab保存为桌面快捷方式和favourites desktop shortcut 建立一个新的desktop文件 cd ~/Desktop touch Jupyter-lab.desktop将文件修改成如下: [Desktop Entry] Version1.0 NameJupyterlab CommentBack up your data with one click Exec/home/cjb/…...

Java 类和对象简介

类是对象的抽象,是一组具有相同特性(属性,事物的状态信息)和行为(事物能做什么)的事物的集合,可以看做一类事物的模板。 对象是类的实例化,是具体的事物。 比如:人类和…...

时间复杂度的计算

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 文章目录123456789时间复杂度(就是一个函数)的计算,…...

站内信箱系统的设计与实现

技术:Java、JSP等摘要:在经济全球化和信息技术成为发展迅速的今时今日,人们通过电子邮件收发进行信息传递已经成为主流。随着互联网和网络办公的发展,电子邮件正在被广泛应用在人们的日常生活中。跟据调查研究统计,在全…...

systemV共享内存

systemV共享内存 共享内存区是最快的IPC形式。共享内存的大小一般是4KB的整数倍,因为系统分配共享内存是以4KB为单位的(Page)!4KB也是划分内存块的基本单位。 之前学的管道,是通过文件系统来实现让不同的进程看到同一…...

Python基础之if逻辑判断

在学习if语句之前,我们先学习一种数据类型,布尔类型(bool),在if语句中,我们需要通过判断条件是否为真或者假,才进入下面的语句块执行。 一、布尔类型(bool) 布尔类型&a…...

实现pdf文件预览

前言 工作上接到的一个任务,实现pdf的在线预览,其实uniapp中已经有对应的api:uni.openDocument(OBJECT)(新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx。)**实现了相关功能…...

【java】alibaba Fastjson --全解史上最快的JSON解析库

文章目录前序Fastjson 简介Fastjson 的优点速度快使用广泛测试完备使用简单功能完备下载和使用将 Java 对象转换为 JSON 格式JSONField创建 JSON 对象JSON 字符串转换为 Java 对象使用 ContextValueFilter 配置 JSON 转换使用 NameFilter 和 SerializeConfigFastjson 处理日期F…...

绝对零基础的C语言科班作业(期末模拟考试)(十道编程题)

编程题(共10题; 共100.0分)(给猛男妙妙屋更一篇模拟考试)模拟1(输出m到n的素数)从键盘输入两个整数[m,n], 输出m和n之间的所有素数。 输入样例:3,20输出样例:…...

按位与为零的三元组[掩码+异或的作用]

掩码异或的作用前言一、按位与为零的三元组二、统计分组1、map统计分组2、异或掩码总结参考资料前言 当a b 0时,我们能够很清楚的知道b是个什么值,b 0 - a -a,如果当a & b 0时,我们能够很清楚的知道b是什么值吗&#xf…...

C++基础篇(一)-- 简单入门

C 语言是在优化 C 语言的基础上为支持面向对象的程序设计而研制的一个通用目的的程序设计语言。在后来的持续研究中,C 增加了许多新概念,例如虚函数、重载、继承、标准模板库、异常处理、命名空间等。 C 语言的特点主要表现在两个方面:全面兼…...

前端整理 —— javascript 2

1. generator(生成器) 详细介绍 generator 介绍 generator 是 ES6 提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态。执行generator,会生成返回一个遍历器对象。返回的…...

VisualGGPK2:《流放之路》MOD制作的高效解决方案

VisualGGPK2:《流放之路》MOD制作的高效解决方案 【免费下载链接】VisualGGPK2 Library for Content.ggpk of PathOfExile (Rewrite of libggpk) 项目地址: https://gitcode.com/gh_mirrors/vi/VisualGGPK2 你是否曾因复杂的资源提取流程而放弃MOD创作&#…...

ANIMATEDIFF PRO性能对比:Ubuntu与Windows系统基准测试

ANIMATEDIFF PRO性能对比:Ubuntu与Windows系统基准测试 同样的硬件,不同的系统,AI视频生成性能究竟有多大差异? 作为一名长期从事AI视频生成的技术从业者,我经常被问到一个问题:在Ubuntu和Windows系统上运行…...

终极压枪指南:5步掌握PUBG罗技鼠标宏精准射击

终极压枪指南:5步掌握PUBG罗技鼠标宏精准射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg logitech-pubg是一款专为《绝地求生》玩…...

Spring AI + DeepSeek 实战:5分钟搞定一个能听懂人话的数据库查询工具

Spring AI DeepSeek 实战:5分钟搞定一个能听懂人话的数据库查询工具 在数据驱动的时代,数据库查询是每个开发者绕不开的日常任务。但当你面对产品经理频繁变更的需求,或是运营同事临时提出的数据提取请求时,反复编写和调试SQL语句…...

OWL ADVENTURE助力在线教育:AI自动批改绘图作业实践

OWL ADVENTURE助力在线教育:AI自动批改绘图作业实践 想象一下,一位在线美术老师,面对上百份刚刚提交的手绘作业。他需要一份份打开,仔细查看学生的构图、线条、比例,然后写下针对性的评语。这个过程不仅耗时费力&…...

【学术干货免费领】200+学术海报模板免费领|科研展示零成本,高效出图不内耗 | 学术会议海报模板,适配国际国内各类学术场合 | 硕博研究生必需,全学科适配,助力科研成果高光出圈

重磅福利来袭!200学术海报模板,全程免费领取,零成本解锁科研展示新方式!适配以下各类科研相关人群:硕博研究生群体包括硕士研究生和博士研究生适用于不同研究阶段:从开题报告撰写到学位论文完成特别适合需要…...

StructBERT中文Large模型技术白皮书精读:结构化预训练策略深度解读

StructBERT中文Large模型技术白皮书精读:结构化预训练策略深度解读 1. 项目概述与核心价值 StructBERT是由阿里达摩院开发的中文预训练语言模型,它在经典BERT架构基础上引入了结构化预训练策略,显著提升了中文语言理解能力。这个模型特别针…...

【部署】windows下虚拟机OpenClaw Ubuntu 24.04.4 安装指南

未来已来,只需一句指令,养龙虾专栏导航,持续更新ing… 概述 前置环境:win10/11、vmware等虚拟机(安装时注意勾选VMware Tools、cpu可以分配2C,内存建议4G,硬盘空间建议给40G) 系统要求 Node.js 22+:安装脚本可自动检测并安装(下文补充手动安装方案); Ubuntu 24.0…...

AI编程实战:如何用Cursor和Coze在1小时内完成文生图小程序开发

AI编程实战:如何用Cursor和Coze在1小时内完成文生图小程序开发 当产品灵感突然闪现,如何在最短时间内将它变成可交互的原型?传统开发流程中,从UI设计到API对接至少需要数天时间。而现在,借助AI编程工具链,我…...

医学影像与卫星图的救星?深入聊聊JPEG-LS算法在边缘计算设备上的应用优势

JPEG-LS算法:边缘计算时代的医学影像与卫星图像压缩利器 当一台CT扫描仪每秒产生数百张16位深度的医学影像,或一颗遥感卫星每天传回数TB的高清地表数据时,传统的图像压缩方案往往面临两难选择——要么牺牲宝贵的诊断细节,要么耗尽…...