Linux - 第10节 - Linux多线程(二)

news2024/11/24 22:41:45

1.Linux线程同步

1.1.同步概念与竞态条件

线程互斥的设计是正确的,但线程互斥在某些场景下并不合理,有可能导致饥饿问题。

\bullet 饥饿问题:某个执行流访问完临界资源后释放锁,此时相较于其他执行流,该执行流离锁更近,更容易再次申请到锁进而访问临界资源,其他执行流长时间得不到锁,无法访问临界资源的情况就是饥饿问题。

\bullet 解决饥饿问题:某个执行流访问完临界资源后释放锁,此时该执行流不能再立即申请锁,而应该排到其他执行流的尾部,等到其他执行流申请锁访问完临界资源后再去申请锁。

线程同步:我们在保证线程互斥的条件下(保证临界资源安全的前提下),让线程能够按照某种特定的顺序访问临界资源,这种特性我们就叫做线程同步。

竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件。

同步的功能:解决饥饿问题;让线程之间互相协同。

注:线程互斥和线程同步不是对立的关系,而是互相补充的关系。线程互斥保证安全,线程同步保证合理。

1.2.条件变量

\bullet 条件变量是完成线程同步的重要机制。

\bullet 在学习条件变量之前,哪个线程被唤醒并执行是由调度器决定的。学习了调度器,我们可以使用调度器来主动的唤醒并执行某个线程。

\bullet 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。 例如:一个线程访问队列时,发现队列为空,它只能等待,只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。

1.2.1.条件变量相关接口

定义条件变量:

pthread_cond_t cond;

初始化条件变量(两种方式):

\bullet 如果条件变量cond是全局变量或static修饰的静态变量,既可以直接使用宏进行静态初始化,也可以使用下面的动态初始化。

\bullet 如果条件变量cond是局部变量,应采用动态初始化。

方式一:静态初始化

cond = PTHREAD_COND_INITIALIZER

方式二:动态初始化

int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict
attr);

参数:

cond:要初始化的条件变量

attr:条件变量属性,设置为NULL即可

返回值:

成功返回0,失败返回错误号

销毁条件变量:

int pthread_cond_destroy(pthread_cond_t *cond);

参数:

cond:要销毁的条件变量

返回值:

成功返回0,失败返回错误号

注:使用 PTHREAD_COND_INITIALIZER 初始化的条件变量不需要销毁。

等待条件满足(两种方式):

方式一:

线程进行等待(在条件变量cond排队等待),如果条件满足则等待的线程被唤醒并执行。

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

参数:

cond:要在这个条件变量上等待

mutex:互斥量

注:条件变量cond要和互斥锁mutex一并使用。

方式二:

线程进行等待(在条件变量cond排队等待),如果条件满足则线程被唤醒并执行,如果abstime时间后还没有条件满足被唤醒则线程自动醒来。

int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);

参数:

cond:要在这个条件变量上等待

mutex:互斥量

abstime:等待时间

唤醒等待(两种方式):

方式一:

唤醒在cond条件变量下等待的队首的线程

int pthread_cond_signal(pthread_cond_t *cond);

参数:

cond:要唤醒线程等待的条件变量

方式二:

唤醒在cond条件变量下等待的队中所有的线程

int pthread_cond_broadcast(pthread_cond_t *cond);

参数:

cond:要唤醒线程等待的条件变量

代码示例1:

创建mythread.cc文件,写入下图一所示的代码,创建makefile文件,写入下图二所示的代码,使用make命令生成mythread可执行程序,使用./mythread命令运行mythread可执行程序,如下图三所示。

创建三个线程执行waitCommand函数,每个线程在函数内部执行到pthread_cond_wait函数调用时都会在条件变量cond下排队等待,等待条件就绪时按照队伍顺序依次被唤醒并执行。

注:在上面的代码中没有用到互斥锁mutex,但是pthread_cond_wait函数接口需要,所以要定义。

1.2.2.生产者消费者模型

1.2.3.基于阻塞队列的生产者消费者模型

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

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

相关文章

【目标检测论文阅读笔记】Detection of plane in remote sensing images using super-resolution

Abstract 由于大量的小目标、实例级噪声和云遮挡等因素,遥感图像的目标检测精度低,漏检率或误检率高。本文提出了一种新的基于SRGAN和YOLOV3的目标检测模型,称为SR-YOLO。解决了SRGAN网络 对超参数的敏感性和模态崩溃问题。同时,Y…

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

【中级软件设计师】—(针对上午题)算法分析与设计(三十八) 一、回溯法 1. 什么是回溯法? 相信"迷宫"是许多人儿时的回忆,大家小时候一定都玩过迷宫游戏。我们从不用别人教,都知道走…

TryHackMe-M4tr1x: Exit Denied(boot2root)

M4tr1x: Exit Denied 大多数人只看到一个完美构建的系统。但你一直都是不同的。你不仅看到表面上的东西,还看到 它下面有什么统治;调节和调节的内部关联机制 几乎完美地管理其每个模块,以至于它试图隐藏所有模块 其多面设计中的微小孔。但是&#xff0c…

【数据结构】链表详解

本片要分享的内容是链表,为方便阅读以下为本片目录 目录 1.顺序表的问题及思考 1.链表的遍历 2.头部插入 2.1开辟空间函数分装 3.尾部插入 纠正 4.尾部删除 5.头部删除 6.数据查找 7.任意位置插入 1.顺序表的问题及思考 上一篇中讲解了顺序表中增删查…

【Linux】如何理解缓冲区

文章目录 &#x1f4d5; 看现象&#x1f4d5; 理解本质&#x1f4d5; 模拟文件接口mystdio.hmystdio.c &#x1f4d5; 看现象 如下代码&#xff0c;运行结果如图。 1 #include<sys/types.h> 2 #include<sys/stat.h> 3 #include<fcntl.h> 4 #include<s…

算法强化--分解因数

大家好,今天为大家带来一道题目 链接&#xff1a;https://www.nowcoder.com/questionTerminal/0f6976af36324f8bab1ea61e9e826ef5 来源&#xff1a;牛客网 [编程题]分解因数 热度指数&#xff1a;8605时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;…

臻图信息:数字技术推动智慧楼宇开启新模式

近年来&#xff0c;在数字技术的迅速发展下&#xff0c;正在深刻影响着各行各业的发展趋势。现代建筑行业已经随着通信技术、AI 智能技术、计算机技术的发展&#xff0c;向着新的发展模式开始转变。 借助数字孪生技术构建数字化、流程化的物联网平台&#xff0c;新的智能楼宇建…

串口通讯详解

目录 一、串口通讯简介&#xff1a; 二、串口通信基本原理&#xff1a; 三、通信方式 四、串口通信特点 一、串口通讯简介&#xff1a; &#xff08;1&#xff09;串口通讯是指通过串口进行数据传输的一种通讯方式&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数…

【Python】实战:生成无关联单选问卷 csv《社会参与评估表》

目录 一、适用场景 二、业务需求 三、Python 文件 &#xff08;1&#xff09;创建文件 &#xff08;2&#xff09;代码示例 四、csv 文件 一、适用场景 实战场景&#xff1a; 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全…

论文阅读:DLME = Deep Local-flatness Manifold Embedding

Author: Zelin Zang, Siyuan Li, Di Wu and Stan Z Li. 1-4: Westlake University 摘要 流形学习&#xff08;ML, Manifold learning&#xff09;旨在从高维数据中识别低维结构和嵌入&#xff0c;然而我们发现现有工作在采样不足的现实数据集上效果不佳。一般的ML方法对数据结…

C++学习记录——이십 map和set

文章目录 1、setmultiset 2、map3、map::operator[] 1、set vector/list/deque等是序列式容器&#xff0c;map&#xff0c;set是关联式容器。序列式容器的特点就是数据线性存放&#xff0c;而关联式容器的数据并不是线性&#xff0c;数据之间有很强的关系。 它们的底层是平衡…

P1038 [NOIP2003 提高组] 神经网络

题目背景 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&#xff0c;兰兰同学在自学了一本神经网络的…

用PyCharm和Anaconda搭建强化学习环境

一些碎语&#xff1a;因为我之前没学习过python&#xff0c;所以搭建这个环境的周期差不多一周&#xff0c;最终搭好了这个又爱又恨的环境&#xff08;这个成语用的多少有点文化沙漠了&#xff09;&#xff0c;这里简单梳理一下搭建环境的完整步骤。 首先下载Anaconda 下载地址…

Java线程间通信方式(3)

前文了解了线程通信方式中的CountDownLatch&#xff0c; Condition&#xff0c;ReentrantLock以及CyclicBarrier&#xff0c;接下来我们继续了解其他的线程间通信方式。 Phaser Phaser是JDK1.7中引入的一种功能上和CycliBarrier和CountDownLatch相似的同步工具&#xff0c;相…

mapbox-gl 移动端(H5)位置共享交互

文章目录 前言逆地理编码&#xff1a;获取周边地点地理编码&#xff1a;查询位置大头针选位位置卡片 前言 分享最近写的一个小demo&#xff0c;功能类似微信小程序端的大头针位置共享功能&#xff0c;需要实现的主要功能包括位置查询、周边地点检索、位置定位等&#xff0c;数…

BUUCTF jarvisoj_level0

小白垃圾做题笔记而已&#xff0c;不建议阅读。。。 这道题感觉主要就是64位程序ebp8 题目中给出了shellcode 我们直接将返回地址覆盖就好。 在main函数中调用了vulnerable_function()函数。 vulnerable函数是一个漏洞函数&#xff1a;(存在缓溢出)&#xff0c;我们只需要将…

html-audio标签样式重写思路

搭配slider 组件 ,利用原生audio的属性和方法重写样式 写个样式.监听url变化 初始化绑定播放, 拖动进度条,拖动音量, 静音按钮等事件 const audioRef ref(null) // 绑定audio标签 const playProcess ref(0) // 进度条绑定的值 const volume ref(1) // 音量绑定的值 const …

C++ STL之vector容器

目录 一、vector容器的介绍 二、vector容器的使用 1.vector的构造函数 2.vector的赋值操作 3.vector的容量与大小 4.vector的插入和删除 5.vector的数据存取 6.vector的互换容器 7.算法模块在vector的应用 ①find算法(std) ②sort算法(std) 一、vector容器的介绍 引…

07 - 进程创建大盘点

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 进程创建回顾2. 再论进程创建2.1 思考2.2 vfork()深度分析2.3 vfork()要点分析2.4 fork()的现代优化2.5 编程实验&#xff1a;fork() &…

【安卓源码】Binder机制2 -- addService 流程

0、binder 进程间通信原理 一次完整的 Binder IPC 通信过程通常是这样&#xff1a; 首先 Binder 驱动在内核空间创建一个数据接收缓存区&#xff1b; 接着在内核空间开辟一块内核缓存区&#xff0c;建立内核缓存区和内核中数据接收缓存区之间的映射关系&#xff0c;以及内核中…