多线程(补充知识)

STL库,智能指针和线程安全

STL中的容器是否是线程安全的? 不是.
原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全,会对性能造成巨大的影响.
而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶).
因此 STL 默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全.

智能指针是否是线程安全的?
对于 unique_ptr, 由于只是在当前代码块范围内生效, 因此不涉及线程安全问题.
对于 shared_ptr, 多个对象需要共用一个引用计数变量, 所以会存在线程安全问题.
但是标准库实现的时候考虑到了这个问题, 基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数.
即share_ptr也是线程安全的!但是注意,share_ptr是线程安全的,但并不意味着它所指向的资源也是线程安全的

其它锁介绍

悲观锁:
在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。
乐观锁:
每次取数据时候,总是乐观的认为数据不会被其他线程修改,因此不上锁。但是在更新数据前,会判断其他数据在更新前有没有对数据进行修改。主要采用两种方式:版本号机制和CAS操作。
CAS操作:
当需要更新数据时,判断当前内存值和之前取得的值是否相等。如果相等则用新值更新。若不等则失败,失败则重试,一般是一个自旋的过程,即不断重试

自旋锁

我们之前学的互斥锁,申请不到锁的时候,都会被挂起等待
那挂起等待的操作是由谁来完成的呢?
答案还是我们的OS(操作系统)老大.
阻塞或者唤醒一个线程对OS来说其实也会是一种负担,假如一个线程持有锁的时间很短,即OS刚让没有抢到锁的线程阻塞等待,还没等一会儿,持有锁的线程就说自己完成任务了,OS又要把刚阻塞等待的线程唤醒,这样效率就不高!
那有没有其它锁,一直轮询,看锁是否释放了,而不是阻塞等待?
答案是有的,就是我们接下来要介绍的自旋锁.
自旋锁的本质就是轮询,不达目的不罢休
线程获取不到自旋锁,并不会被阻塞等待,而是一直询问拿到锁的线程,什么时候好?一旦完成任务,释放锁,就立马获取锁,省下了线程状态切换的消耗
那什么时候采用互斥锁,什么时候采用自旋锁呢?
关键就是等待时间的长短,即访问临界区要花费多少时间
假如锁被占用的时间很短,那自旋的效果就很不错
反之,假如一直占用,来完成任务,那自旋的效果就大打折扣,白白浪费处理器资源

读写锁

在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。
相比较改写,它们读的机会反而高的多。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极大地降低我们程序的效率。
那么有没有一种方法,可以专门处理这种多读少写的情况呢? 有,那就是我们接下来要介绍的读写锁。

读者写者的"321"原则

3: 读者读者(无关系) 写者写者(互斥) 读者写者(互斥,同步)
2:读/写
1:交易场所

可以看到它和我们生产者消费者模型是非常相似的,唯一有一个重大区别就在于在cp问题中,消费者之间是互斥的,但是读者与读者是互相不影响的
原因在于消费者会拿走数据!但是读者并不会,只是访问相应的数据
理解读者写者问题,可以类比于我们小学时出黑板报
看黑板报的同学就是读者,出黑板报的同学就是写者
读者与读者间看黑板报互不影响
但是写者工作的时候,读者就不要看了,看了也没用,都没出完;同理,读者看的时候,写者就不要继续工作了,别人欣赏着,你突然将黑板报全部擦干净,只会得罪别人.

对应的接口

在这里插入图片描述

伪代码讲解原理

本质上是采用类似信号量的方式来实现的
在这里插入图片描述
最核心的其实就是保证
有一个读者读,写者不能写;但其它读者还可以进
所以最关键的还是读者这部分信号量的申请
在这里插入图片描述

写者饥饿问题

由上面的伪代码我们也可以发现
写者这个执行流是很容易长期持有不到锁的,只要reader_cnt一直不为0,也就是有读者读,写者就写不了
这也符合我们有些公共数据修改的机会比较少的场景(修改频率低)
一般默认读者优先,即有一把锁空闲出来,默认读者线程拿
我们还可以设置为写者优先策略,正在读的读者线程依旧可以继续读完,但是比写者线程晚到的读者线程就要往后排一下队.
在这里插入图片描述

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

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

相关文章

【LeetCode】每日一题 2023_11_25 二叉树中的伪回文路径(dfs,数组/位运算)

文章目录 刷题前唠嗑题目:二叉树中的伪回文路径题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode?启动!!! 这个月第一次周末早起~ 题目:二叉树中的伪回文路径 题目链接:1457. 二…

20世纪的葡萄酒有哪些创新?

葡萄酒是用酵母发酵的,直到20世纪中叶,这一过程都依赖于自然产生的酵母。这些发酵的结果往往不一致,而且由于发酵时间长,容易腐败。 酿酒业最重要的进步之一是在20世纪50、60年代引进了地中海的纯发酵菌种酿酒酵母,俗称…

你要的fiddler快捷键全部在这里了,学最全的快捷键,做最快的IT程序员

一、常用三个快捷键 ctrlX :清空所有记录 CtrlF:查找 F12:启动或者停止抓包 使用 QuickExec Fiddler2 成了网页调试必备的工具,抓包看数据。Fiddler2自带命令行控制。 fiddler 命令行快捷键:ctrl q ,然后 输入 help…

Codeforces Round #911 (Div. 2)

A.Cover in Water 题意: 有一个 1 n 1 \times n 1n的水池,里面有些格子可以加水,有些格子是被堵上的,你可以进行以下两种操作: 1.往一个空的格子里加水 2.移除一个有水的格子中的水,并将这些水添加到另…

合并区间[中等]

一、题目 以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。 示例 1: 输入:intervals […

【笔记】小白学习电路维修

学习视频(b站):从0开始学电路 从0开始学电路维修 p1 黄色长方体元件P2 故障率最高的元件p3带芯铜丝线圈是什么区分电感和变压器接入电路分析: p4 交流和直流分界线整流桥接线整流桥故障判断 带色环的不一定是电阻 p1 黄色长方体元…

Windows10-用户账户控制、Windows远程桌面

Windows10用户账户控制怎么设置白名单 问题引出: 安装低版本搜狗输入法后经常弹出用户账户控制 解决方案: 全局模式: UAC控制最早出现在Windows Vista中,用户帐户控制(UAC)是一项旨在防止对您的计算机…

web:[ZJCTF 2019]NiZhuanSiWei1

题目 点进题目,网页显示如下,需要代码审计 $_GET["text"]和$_GET["file"]来获取传入的两个参数text和file。使用isset()函数来检查$text变量是否已设置并且不为null。如果设置了并且不为null,则执行下面的逻辑。在下面的…

贪心算法(新坑)

贪心入门 概述: 贪心算法是一种在每一步选择中都采取当前最优解的策略,希望最终能够得到全局最优解的算法。简单来说,它会不断地做出局部最优的选择,相信通过这种选择最终能够达到全局最优。 举个例子来说明。假设你要从一个迷…

CCFCSP试题编号:202206-2试题名称:寻宝!大冒险!

一、题目 二、分析 因为藏宝图左下角位置一定是一棵树,所以只要把所有绿化图中每一棵树,与之相匹配,然后判断,是否整个藏宝图都是绿化图的一部分,如果是那就计数count1。所以来看,结果count最大也就是n(绿…

进程和线程的关系

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 进程&线程 1. 什么是进程PCB 2. 什么是…

高等数学零基础篇复习笔记

预备章 零基础高等数学入门知识 第一节 集合、运算与关系 第二节 三角函数与反三角函数 三角函数的公式 反三角函数 第三节 常见不等式及数列 划重点 第一章 函数、极限与连续 第一节 函数及函数的初等特性 特殊函数 反函数 函数的初等特性 ①有界性 ②奇偶性 偶函数图像…

高中生分科考试--座位编排系统

这个系统是帮我一同学的哥哥的做的座位编排系统,他是某个学校的教育从事者 基本需求:就是能够根据他提供的各个分科班级同学的成绩单来选择相同分科的考场编排(按成绩高低),同时输入相应的考场数,和每个考…

解决git action发布报错:Input required and not supplied: upload_url

现象: 这个问题死活都找不到原因,后来打了一段调试的代码 - name: Debug Create Release Output run: | echo "Release ID: ${{ env.RELEASE_ID }}" echo "Release Upload URL: ${{ env.RELEASE_UPLOAD_URL }}" env: RELEASE_ID: ${…

docker镜像原理

什么是镜像 容器解决应用开发、测试和部署的问题,而镜像解决应用部署环境问题。镜像是一个只读的容器模板, 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件,是启动容器的基础。镜像所打 包的文件内容就是容器的系统运行环…

C++初阶--String类的使用

string类 在C语言中,我们总是用char* 的类型来创建一个变量,存储一个字符串;当我们想对它进行修改或者读写时,需要自我创建空间和使用string.h的库函数来进行操作它; 而在C中,C专门提供了一个头文件 stri…

028 - STM32学习笔记 - ADC(二) 独立模式单通道中断采集

028 - STM32学习笔记 - 结构体学习(二) 上节对ADC基础知识进行了学习,这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef(其中xx为外设名,例如…

智能优化算法应用:基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于阴阳对算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阴阳对算法4.实验参数设定5.算法结果6.参考文献7.…

《2023全球隐私计算报告》正式发布!

2023全球隐私计算报告 1、2023全球隐私计算图谱2、国内外隐私计算相关政策3、隐私计算技术的最新发展4、隐私计算技术的合规挑战5、隐私计算的应用市场动态6、隐私计算开源整体趋势7、隐私计算的未来趋势 11月23日,由浙江省人民政府、商务部共同主办,杭州…

智慧化工~工厂设备检修和保全信息化智能化机制流程

化工厂每年需要现场检修很多机器,比如泵、压缩机、管道、塔等等,现场检查人员都是使用照相机,现场拍完很多机器后,回办公室整理乱糟糟的照片,但是经常照了之后无法分辨是哪台设备,而且现场经常漏拍&#xf…