线程--线程同步

ops/2024/10/20 5:37:15/

这里写目录标题

  • 同步概念
  • 互斥量
    • 原理
    • 锁的注意事项
      • 1、cpu时间轮片
      • 2、建议锁
      • 总结
    • 使用锁来管理线程同步
      • 问题产生
      • 主要函数
      • init、destory
      • lock、unlock
      • 代码
      • 注意事项
  • 条件变量
    • 二级目录
    • 二级目录
    • 二级目录
  • 信号量
    • 二级目录
    • 二级目录
    • 二级目录
  • 一级目录
    • 二级目录
    • 二级目录
    • 二级目录

同步概念

线程同步概念

在这里插入图片描述

数据混乱原因

在这里插入图片描述

互斥量

原理

在这里插入图片描述
多个线程操作共享区时,每个线程访问时,会加上一把锁,只允许某单个线程对共享区进行操作,操作完之后,再解锁,表示允许其他线程访问

而这个锁就叫互斥锁,这个互斥锁只有一把,各个线程争抢这把锁,谁先拿到锁,谁先有操作共享区的权利

锁的注意事项

1、cpu时间轮片

在这里插入图片描述
当线程T1执行写入0的操作的过程中,T1的cpu时间到了,那么就会让出cpu,之后给到T2,但是由于此时共享区还在被锁的状态,所以T2只好阻塞在锁上,等待锁的解锁,之后,过段时间,就会又让出cpu给到T3,T3此时也会阻塞在锁上,然后过段时间,再次让出cpu给T1,T1此时拿着锁,可以操作共享区,所有会继续上次中断的地方继续操作共享区

2、建议锁

在这里插入图片描述
假如说,当T3拿到cpu时间之后,并不阻塞在锁上,而是就要强制访问共享区,那么也是可以的,只不过会造成数据混乱而已,所以,互斥锁并不是一个强制的概念,而是一个建议,他的强制性体现在代码逻辑上,而不是底层系统的强制操作,如果T3的代码逻辑中使用了锁,那么T3就无法访问共享区,当然T3也可以不使用锁,直接访问,代码层面也是可以运行的

总结

在这里插入图片描述

使用锁来管理线程同步

问题产生

在这里插入图片描述
使用两个线程,同时向“公共输出”(共享区)写数据,没有加锁机制

效果:
打印完全随机,各个线程的一帧数据写入都会被其他线程打断、插入其他数据
在这里插入图片描述

主要函数

在这里插入图片描述
其中,trylock函数,表示会让当前线程尝试加锁,看看能不能加上,加不上了先去做自己的事,过段时间再来尝试,而不是像之前说的“阻塞在锁上”

而五个函数的下面是一个变量,这个变量就是互斥量,就是锁本身,他只有0、1两种取值

大概流程:
在这里插入图片描述

init、destory

在这里插入图片描述
对于init:
参数一:传入互斥锁的地址,
参数二:互斥锁的属性,如果想使用默认属性,那么就传NULL

其中,对于restrict关键字:
他是用来修饰指针的,
在这里插入图片描述
可以说,这个内存就认定了这个指针,注意与指针认定内存有区别(顶层const)

对于顶层const,是站在指针的角度,对于一个指针来说,他只存储某块内存的地址,但是该地址还可以被其他指针所存储和操作
而对于restrict,是站在内存的角度,对于一块内存的操作来说,他只认定那个指针,其他指针无法操作该内存

返回值:成功:0。失败:返回error number

lock、unlock

在这里插入图片描述

代码

1、创建互斥锁(全局变量)
在这里插入图片描述
2、在主线程创建子线程之前,要将锁初始化完毕
在这里插入图片描述
并在最后所有线程结束后销毁互斥锁:
在这里插入图片描述
3、在每个线程访问共享区的前后进行加锁和解锁:
子线程:
在这里插入图片描述
主线程:
在这里插入图片描述

效果:
在这里插入图片描述每个线程的数据被完整的加入到了共享区

注意事项

假如说,我们把解锁的操作移到循环步的最后:
在这里插入图片描述
在这里插入图片描述
可以看到,主线程和子线程都使用加锁和解锁把原来的所有代码包裹起来,这样结构上确实很清晰

但是:
在这里插入图片描述
在这里插入图片描述
可以看到,最终要么只执行主线程,要么只执行子线程

原因:
由于线程在解锁之后立马就进入下一个循环,使得解锁之后该线程又拿到了锁,所以,就会一直保持一个线程,另一个线程无法拿到锁

所以:
在这里插入图片描述
我们的加锁和解锁操作,只在访问共享区的前后,立即执行,锁尽量只包含访问共享区的代码部分

补充:
在这里插入图片描述
可以将互斥锁的操作看成整数,
初始化时,值为1,表示当前锁可以被拿取并使用
之后,加锁时,–,那么值变为0,表示已经加锁,锁目前被占用,无法使用,其他线程就无法使用锁,无法访问共享区了
最后,解锁时,++,值变回1,表示再次可以使用

条件变量

二级目录

二级目录

二级目录

信号量

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录


http://www.ppmy.cn/ops/110139.html

相关文章

openVX加速-基本概念和简单代码实现

OpenVX 是一个用于计算机视觉和图像处理的跨平台加速标准库,旨在提高在异构平台(如 CPU、GPU、DSP 等)上的执行效率。OpenVX 提供了一组优化的、可移植的 API,用于加速常见的视觉算法,使开发者能够在不同硬件平台上实现…

[最佳实践]采集-IoT/嵌入式日志

IoT(Internet of Things)正在高速增长,越来越多设备开始逐步走进日常生活,例如智能路由器、各种电视棒、天猫精灵、扫地机器人等,让我们体验到智能领域的便利。传统软件领域的嵌入式开发模式在IoT设备领域的应用遇到了…

ubuntu 24.04 : Failed to initialize NVML: Unknown Error

我想在docker 内部使用gpu时,当我执行nvidia官方的测试命令: sudo docker run --rm --runtimenvidia --gpus all ubuntu:22.04 nvidia-smi出现l了如题的错误。 解决方法: 首先执行如下文件: sudo vim /etc/nvidia-container-r…

解锁生活密码,AI答案之书解决复杂难题

本文由 ChatMoney团队出品 介绍说明 “答案之书智能体”是您贴心的智慧伙伴,随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈,还是在情感世界里迷失方向,亦或是对个人成长感到迷茫,它都能倾听您的心声,并给…

无人机之伯努利定律

无人机的伯努利定律是解释无人机飞行原理的关键理论之一,它主要阐述了流体(如空气)在流动过程中速度与压力之间的关系。以下是对无人机伯努利定律的详细解释: 一、伯努利定律的基本原理 伯努利定律是流体力学中的一个基本原理&am…

相机光学(三十七)——自动对焦原理

1.自动对焦的三种方式 目前在手机上采用的自动对焦系统包括反差对焦、相位对焦和激光对焦三种方案,下面我们来看一下它们的工作原理和相互之间的区别是什么。 1.1反差对焦【CDAF】- Contrast Detection Auto Focus 反差对焦是目前普及率最高、使用最广泛、成本相对…

tabBar设置底部导航栏

如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页,简单来说就是像美团外卖下面的导航栏一样可以任意切换 1.首先创建三个页面,在页面里面可以写一些东西或者放一张图片方便区分。 2.…

跟《经济学人》学英文:2024年09月07日这期 What to read about the British economy

What to read about the British economy Britain used to be the world’s richest country. These six books explain how it came to be, and why it is no longer 原文: IN RECENT YEARS the British economy has tended to be in the news for the wrong re…