测开必备知识:线程安全和线程不安全

news2024/11/16 17:28:31

什么是线程安全

线程安全指的是在多线程环境下,一个对象或者数据结构能够保证在并发访问时依然能够维持其预期的行为,不会出现数据不一致或者其他意外情况。

反之就是线程不安全。

多线程环境下可能产生的问题

当多个线程同时访问共享的资源(比如对象、变量、数据结构等)时,可能会引发以下问题:

1.竞态条件(Race Condition):当多个线程试图同时访问和修改共享资源时,由于操作的顺序不确定,导致最终结果不可预测。

2.数据竞争(Data Race):当一个线程在写入数据的同时,另一个线程在尝试读取或写入同一块数据时,可能会导致数据不一致的问题。

3.死锁(Deadlock):当多个线程相互等待对方释放资源的情况,导致所有线程都无法继续执行的状态。

4.内存一致性错误(Memory Consistency Errors):由于缓存一致性等问题,导致不同线程看到的共享变量的值不同步。

使用python展示一个线程不安全的例子

import threading

class Counter:
    def __init__(self):
        self.value = 0

    def increment(self):
        self.value += 1

def worker(counter):
    for _ in range(1000000):
        counter.increment()

counter = Counter()
threads = []
for _ in range(10):
    thread = threading.Thread(target=worker, args=(counter,))
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

print("Final counter value:", counter.value)

代码解释:

在这个例子中,我们有一个简单的计数器类Counter,它具有一个increment()方法用于递增计数器的值。然后我们创建了10个线程,每个线程都会调用increment()方法来递增计数器的值1000000次,理论上输出值应该是1000000。最后,我们打印出计数器的最终值发现并不是我们期望的1000000,可能是小于1000000的值。由于Python中的+=操作不是原子性的,多个线程可能同时读取并修改计数器的值,导致竞态条件,从而使最终的计数器值可能不正确,这个就是线程不安全导致的原因。

图片

我们修改一下代码,将代码从线程不安全改为线程安全,代码如下:

import threading

class SafeCounter:
    def __init__(self):
        self.value = 0
        self.lock = threading.Lock()

    def increment(self):
        with self.lock:
            self.value += 1

def safe_worker(counter):
    for _ in range(1000000):
        counter.increment()

safe_counter = SafeCounter()
safe_threads = []
for _ in range(10):
    thread = threading.Thread(target=safe_worker, args=(safe_counter,))
    safe_threads.append(thread)
    thread.start()

for thread in safe_threads:
    thread.join()

print("Final safe counter value:", safe_counter.value)

在这个例子中,我们对Counter类进行了修改,添加了一个锁lock。在increment()方法中,我们使用with self.lock:语句来确保在同一时间只有一个线程能够修改计数器的值。这样就避免了竞态条件,从而使得计数器的值在多线程环境下是正确的。

执行的结果:

图片

 

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

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

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

相关文章

QT笔记 - QProcess读取外部程序(进程)消息

简要介绍 QProcess可用于在当前程序中启动独立的外部程序(进程),并进行通讯,通讯原理是通过程序的输入或输出流,即通过c中的printf()和或c的std::cout等。 函数 void QProcess::start(const QString & program, const QStringList &am…

直播美颜SDK开发方案详解:如何打造智能化主播美颜工具?

在竞争激烈的市场环境下,如何通过直播美颜SDK打造智能化的主播美颜工具,已成为技术开发者和产品经理们关注的焦点。本篇文章将从核心技术、开发流程和优化策略等方面,详细解析如何构建一款智能化的主播美颜工具。 一、核心技术解析 1.人脸识…

第10讲 后端2

主要目标:理解滑动窗口法、位姿图优化、带IMU紧耦合的优化、掌握g2o位姿图。 第9讲介绍了以为BA为主的图优化。BA能精确优化每个相机位姿与特征点位置。不过在更大的场景中,大量特征点的存在会严重降低计算效率,导致计算量越来越大&#xff0…

图纸安全管理措施有哪些?这九大措施全方位保护图纸安全

图纸安全管理措施是一个综合性的体系,旨在通过技术手段和管理措施确保图纸的机密性、完整性和可用性。以下是一些关键的图纸安全管理措施,以及软件安企神的应用。 一、保密协议与意识教育 签订保密协议:与所有接触图纸的员工签署保密协议&am…

计算方法——插值法程序实现二(牛顿法)

例题 给出的函数关系表,分别利用牛顿插值法计算的近似值。 0.10.20.30.40.51.1051711.2214031.3498591.4918251.648721 参考代码一:Python代码实现(自编码) import math """ :difference_quotient差商函数 &quo…

基于AppBuilder自定义组件开发大模型应用

AppBuilder简介: 如果大家不了解AppBuilder的话,可以先到这里了解一下: https://cloud.baidu.com/doc/AppBuilder/s/6lq7s8lli 一句话简介: 千帆AppBuilder(以下简称AppBuilder)是基于大模型搭建AI原生应…

MySQL进阶篇2

三、SQL优化 3.1 插入数据 批量插入推荐每次在 500 ~ 1000 条数据时进行使用。如果大于1000,可以考虑分批次进行插入。 大批量插入数据(100万、1000万) 主键顺序插入的性能比乱序要高 3.2 主键优化 数据组织方式 页分裂 主键顺序插入 主键乱序插入 页合并 (del…

计算机网络-VRRP工作原理

一、VRRP工作原理 前面我们大概了解了VRRP的一些基础概念,现在开始学习VRRP的技术原理。VRRP的选举及工作步骤: 确定网关地址 选举主备 主设备发送VRRP报文通知Backup设备 主设备响应终端ARP并维持在Master状态 终端正常发送报文到网关进行转发 因为我们…

计算机毕业设计Hadoop+PySpark共享单车预测系统 PyHive 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习

《Hadoop共享单车分析与预测系统》开题报告 一、课题背景与意义 1.1 课题背景 随着共享经济的快速发展,共享单车作为一种新型绿色环保的共享经济模式,在全球范围内迅速普及。共享单车通过提供便捷的短途出行服务,有效解决了城市居民出行的…

网络安全服务基础Windows--第9节-DNS部署与安全

域名基础知识 域名是互联⽹上⽤来识别各种实体(如服务器、服务、⽹络)的可读名称。它是⼀种⽅便记忆的地址,⽤于代替IP地址,因为IP地址由数字组成,不容易记忆。域名通过⼀种层级结构的系统组织起来,从最⼀ …

以人口金字塔图为例,在线绘制左右双侧堆叠条形图

导读: 人口金字塔(population pyramids)用于展示一个特定人口的年龄和性别分布。本质上是一种水平条形图。左侧是男性的数据,右侧是女性的数据。 Proc Natl Acad Sci U S A.文章《Demographic change and assimilation in the ea…

电脑实时监控软件分享!一分钟速览,五个好用的实时屏幕监控软件(良心推荐)

"工欲善其事,必先利其器。"在信息化时代,企业管理的高效与安全离不开先进的工具支持。 电脑实时监控软件已是现代企业管理的重要利器,不仅能帮助管理者实时掌握员工的工作状态,还能有效防止数据泄露,确保信…

FLV封装H265

针对FLV格式,目前许多开源项目和常见的视频处理工具和流媒体服务器,仍主要支持H.264视频编码格式,尚未完全兼容H.265。ffmpeg和vlc都不支持H265编码格式的FLV,不知道后续版本会不会支持。RTMP也是用FLV格式传输音视频,…

CPP继承(下)

目录 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 单继承 多继承 菱形继承 菱形继承的问题 虚继承 虚拟继承解决数据冗余和二义性的原理 继承的总结和反思 笔试面试题 继承与友元 友元关系不能继承,也就是说基类友元不能访问子类私有和保护…

淘宝扭蛋机小程序开发,吸引更多的消费者

随着互联网科技的快速发展,小程序已经成为了一个必不可少的发展趋势。小程序具有门槛低、曝光度高、方便的优势,能够满足消费者的需求,还可以为企业商家带来更多的影响力,因此,扭蛋机小程序也成为了市场发展的重要力量…

Linux网络编程:守护进程

目录 1.会话 2.守护进程的特点 3.如何将一个进程变成守护进程 1.会话 在Linux下一个会话就是 终端文件 bash,会话就是人类和计算机沟通的窗口和解释器。 可以在xshell中新建立一个会话验证一下。 复制会话 使用 ls /dev/pts 命令,查看有几个终端文…

(Lane Deteciton-1)PersFormer

介绍 在自动驾驶中,下游模块如规划和控制通常需要将车道位置表示为正交的鸟瞰图(BEV)而不是前视图表示。使用BEV表示有助于更好地与环境中的交互式代理(如车辆、道路标志、交通灯等)对齐任务,并且与其他传…

tomato靶场通关

1、使用nmap扫描C段查找网址 2、使用dirb扫描目录 3、打开网站查看目录 4、发现一个info.php文件查看 5、查看源代码,发现文件包含漏洞 6、查看etc/passwd ,查看日志 7、写入一句话木马 8、使用蚁剑进行连接查看,可以使用终端

Vue 3 组合式 API

相比较 Vue.js 2.x 版本传统的方法组织形式, Vue.js 3.x 提出了组合式 API 的格式。本 章带领读者系统学习 Vue.js 3.x 新增的有关组合式 API 的知识。 本章主要涉及到如下知识。 组合式 API 与选项式 API 的语法区别。 在组合式 API 中使用生命周期…

从监控到智能:EasyCVR视频汇聚平台助力加油站安全监管升级转型

随着科技的不断进步,视频监控技术在各个行业的应用日益广泛,尤其在加油站这一关键领域,视频智能监管系统的应用显得尤为重要。TSINGSEE青犀视频EasyCVR视频汇聚平台作为一款基于“云-边-端”一体化架构的视频融合与AI智能分析平台&#xff0c…