【Linux】线程结束

news2024/11/10 21:22:25

目录

线程安全和重入

死锁

STL中的容器不是线程安全的

线程安全的单例模式

自旋锁

读者写者问题


线程安全和重入

线程安全:多个线程并发执行同一段代码时,不会出现不同的(异常的)结果,我们就说线程是安全的。常见于对全局变量或静态变量进行操作,并且没有锁保护的情况下,会出现该问题

重入:同一个函数被不同的执行流调用,当前一个执行流还没有执行完,就有其他的执行流再次进入,我们就称之为重入。如果一个函数在重入的情况下,运行结果不会出现任何不同或任何问题,则该函数被称为可重入函数,否则叫不可重入函数

线程安全说的是线程在执行中的相互关系,而重入说的是函数的特点,它们其实区别还是很大的,它们之间的关系我们可以理解为下图:

常见的线程不安全的情况

1.不保护共享变量的函数

2.函数状态随着被调用,状态发生变化的函数

3.返回指向静态变量指针的函数

4.调用线程不安全的函数

常见的线程安全的情况

1.每个线程对全局变量或静态变量只有读取的权限,而没有写入的权限,一般来说这些线程是安全的

2.类或者接口对于线程来说都是原子操作

3.多个线程之间的切换不会导致该接口的执行结果存在二义性

死锁

死锁顾名思义就是锁死了,就是说代码不会向下正常推进了,举一个最简单的例子:我们错把unlock仍写成了lock,此时线程就会因为申请不到锁而一直阻塞在这里,当然这只是为了理解什么叫死锁

举一个更加普遍的例子,线程1需要先申请锁1再申请锁2才可以访问资源,线程2需要先申请锁2再申请锁1才可以访问资源,当线程1申请完锁1,线程2申请完锁2后由于它们再也申请不到另一把锁了,所以就会一直阻塞,就会出现死锁问题

由上面的例子我们可以得到产生死锁的四个必要条件

1.互斥条件:一个资源每次只能被一个执行流使用。就是说要加锁

2.请求与保持条件:我既保持我的资源(锁),我还要你的资源

3.不剥夺条件:一个执行流已获得的资源,在未使用完之前,不能强行剥夺。就是说不会去抢别人的锁

4.循环等待条件:线程之间形成一种头尾相连的循环等待资源的关系

上面说的是必要条件,就是如果产生死锁,那么四个条件必然发生,那么我们只要破坏掉其中的一个条件即可

1.破坏第一个条件就是非必要不加锁

2.破坏第二个条件就是不保持条件了,如果拿着锁1,申请不到锁2,那么干脆把锁1也释放掉

3.剥夺别人的锁,释放掉别人的锁

4.尽量不要构成循环等待,每个线程申请锁的顺序要一致

STL中的容器不是线程安全的

因为STL的设计初衷就是为了将性能挖掘到极致,而一旦涉及到加锁保证线程安全,会对性能造成巨大的影响

智能指针是否线程安全?

对于unique_ptr由于只是在当前代码块范围内生效,因此不涉及线程安全问题

对于shared_ptr,多个对象共用一个引用计数变量,所以会存在线程安全问题,标准库实现的时候考虑到了这个问题,基于原子操作保证它是线程安全的

线程安全的单例模式

单例模式就是只创建一个对象,通常有饿汉和懒汉两种方式,饿汉是在主函数加载之前就创建出对象,懒汉是第一次用的时候才创建对象

饿汉是线程安全的,因为程序加载后多个线程只是去获取对象的指针,而懒汉我们则需要通过加锁的方式实现线程安全,那么我们下面可以改写线程池使线程池支持单例模式

我们就是创建静态的对象指针,创建一个静态的获取对象的函数,构造私有化,禁用拷贝构造和赋值重载

自旋锁

自旋其实就是一个不断询问的过程,我们是否用自旋锁就跟线程在临界区中执行时间的长短有关了,如果执行时间长的话,比如有IO操作或者网络请求,我们就用之前学的普通的锁,线程会挂起等待;如果执行时间短,比如都是内存级的操作,我们就可以不必挂起等待,而是不断的询问申请锁

读者写者问题

读者之间没有关系,因为读者跟之前的消费者不同,读者并不会把数据拿走;读者和写者之间是互斥和同步的关系,写到一半不能读,会导致数据不一致的问题;写者之间是互斥关系

他们之间的关系可以用下面的伪代码来表示

我们上面的接口默认就是读者优先的,会有写者饥饿问题

我们如果想让写者优先,可以让没来读的人先别来读了,让正在读的人读完

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

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

相关文章

如何学好文件操作,快来看这篇文章(沉淀中)!!!!

文章目录 1. 为什么使用文件?2. 什么是文件?2.1 程序文件2.2 数据文件2.3 文件名 3. ⼆进制文件和文本文件?4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. ⽂件的顺序读写5.1 顺序读写函数介绍…

jQuery库

注明&#xff1a;本文参考自&#xff1a;jQuery - 白月黑羽 (byhy.net) jQuery安装 Download jQuery | jQuery下载到本地 ps: script标签中的src属性&#xff1a;表示包含要执行的代码的外部文件位置 <!DOCTYPE html> <html lang"en"><head><s…

unity游戏开放:标记物体 一目了然

Unity游戏开发:标记物体,让开发变得一目了然 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发:标记物体,让开发变得一目了然前言1. 什么是Tag&#xff1f;2. Unity中如何添加和管理Tag步骤1&am…

vue如何引入element-ui

2.x用element-ui 3.x用element-plus https://blog.csdn.net/weixin_41207479/article/details/127066333 引入element-ui的三种方式

点餐API接口对接的过程中需要注意哪些问题

以下是点餐 API 接口对接的一般步骤&#xff1a; 选择合适的点餐 API 服务提供商&#xff1a;市面上有不少提供点餐 API 的平台。你需要根据自身业务需求、预算、接口的稳定性和性能、技术支持等因素来综合考量选择。注册与申请&#xff1a;在选定 API 服务提供商后&#xff0…

数据响应式

响应式原理 课堂主题 1.利用defineProperty实现数据劫持2.利用ES6中proxy实现数据劫持3.实现数据驱动视图更新&#xff0c;实现数据响应4.发布订阅模式 知识点 defineProperty&#xff1b;Proxy代理数据劫持发布订阅观察者模式与发布订阅数据响应式 defineProperty Objec…

Junit单元测试入门

目录 一、单元测试 1.1 基本概念 1.2 以往测试存在的问题和不足 二、快速入门 2.1 基本步骤 2.2 基本使用示例&#xff08;vscode为例&#xff09; 2.2 断言机制&#xff08;重要&#xff09; 2.3 其它注解 一、单元测试 1.1 基本概念 针对最小单元的测试&#xff0c…

集成电路学习:什么是CPU中央处理器

一、CPU&#xff1a;中央处理器 CPU&#xff0c;全称Central Processing Unit&#xff0c;即中央处理器&#xff0c;是计算机系统的核心部件&#xff0c;负责执行程序指令&#xff0c;完成数据的算术运算或逻辑运算等任务。它是计算机中最重要的硬件之一&#xff0c;相当于计算…

【Qt 事件】—— 详解Qt事件处理

目录 &#xff08;一&#xff09;事件介绍 &#xff08;二&#xff09;事件的处理 &#xff08;三&#xff09;按键事件 3.1 单个按键 3.2 组合按键 &#xff08;四&#xff09;鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件 4.3 鼠标双击事件 4.4 鼠标移动事件 4.5…

【Redis】Redis 典型应⽤ - 缓存 (cache)

Redis 典型应⽤ - 缓存 cache 什么是缓存使⽤ Redis 作为缓存缓存的更新策略1) 定期⽣成2) 实时⽣成 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿关于缓存预热 (Cache preheating)关于缓存穿透 (Cache penetration)关于缓存雪崩 (Cache avalanche)关于缓存击穿 (Cache breakdown…

OpenLayers3, 航线动画实现

文章目录 一、前言二、代码实现三、总结 一、前言 本文基于OpenLayers3&#xff0c;实现航线动画的功能。 二、代码实现 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quo…

题解AtCoder ABC 358 F Easiest Maze

一道模拟题。 思路 最短的路线是直接竖着走下来&#xff0c;经过 n n n 个格子&#xff0c;所以 k k k 最小是 n n n。如果想要延长路线&#xff0c;可以采用九转大肠的形状&#xff0c;就像这样&#xff1a; 可以发现&#xff0c;每次向左走之后都必须走回来&#xff0c;…

关于几道计算机网络题的解答

2017年12月28日&#xff0c;星期四&#xff0c; 照片上的第一题中多项式的指数看不清&#xff0c;但没关系&#xff0c;就现在的情形&#xff0c;说一下大概的思路&#xff0c;参考着再结合题目中实际的参数&#xff0c;再套一遍就能把题目解出来了&#xff0c; 假设&#xf…

JS 如何判断是否是IE浏览器

例子 if(!!window.ActiveXObject || "ActiveXObject" in window){alert("抱歉&#xff0c;不支持IE浏览器&#xff01;");return; }

kafka使用

异步发送数据 package com.shf.kafka.producer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serializa…

算法基础-双指针算法

最长连续不重复子序列 双指针[j, i]维护的是以a[i]结尾的最长连续不重复子序列[j, i - 1]是前一步得到的最长连续不重复子序列&#xff0c;所以如果[j, i]中有重复元素&#xff0c;一定是a[i]&#xff0c;所以[j, i - 1]中一定有一个数字与a[i]重复&#xff0c;因此右移j直到a[…

【AI学习笔记】AIGC,AI绘画 ComfyUI+ComfyUI Manager安装

【AI学习笔记】ComfyUIComfyUI Manager安装 最近在面向BOSS直聘学习ComfyUI的使用&#xff0c;但是不出意外&#xff0c;因为学习者们迥异的电脑配置以及杂乱的AI软件工具包互相纠缠&#xff0c;跟人工智能相关的环境安装多少都会遇到点教程预料不到的BUG。 推荐入门教程&…

基于SpringBoot的智能医院管理系统

&#x1f4a5;&#x1f4a5;源码和论文下载&#x1f4a5;&#x1f4a5;&#xff1a;基于SpringBoot的智能医院管理系统-源码论文报告数据库文件.rar 1. 系统介绍 随着计算机科学的迅猛发展和互联网技术的不断推进&#xff0c;人们的生活方式发生了巨大的变化&#xff0c;同时也…

华为云征文 | Tomcat保姆级安装教程

简介 华为云Flexus云服务是新一代开箱即用、体验跃级、面向中小企业和开发者打造的高品价比云服务产品。Flexus云服务器X实例是华为云Flexus云服务的一个产品。 Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力云服务器&#xff0c;可智能感知业务负载&#…

借鉴腾讯系统架构从小到大的过程 - 如何做好一个系统设计?不限于(慧哥)慧知开源充电桩平台

推荐一套企业级开源充电桩平台&#xff1a;完整代码包含多租户、硬件模拟器、多运营商、多小程序&#xff0c;汽车 电动自行车、云快充协议&#xff1b;——(慧哥)慧知开源充电桩平台&#xff1b;https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001…