进程_线程 之(三) --- 线程安全

线程安全

  • 无问题时
 1 import threading
 2 
 3 m = 0
 4 # 如果多个线程去操作同一个外部资源,那么就可能造成线程的不安全。
 5 # 多个线程同时访问同一个外部资源,就可能会出现读写冲突
 6 def increase():
 7     global m
 8     for i in range(100): # 循环次数少,不会出现问题
 9         m += 1
10     print(m)
11 
12 # 线程冲突
13 def conflict():
14     # 创建5个线程,这5个线程同时的去操作外部的m变量
15     for _ in range(5):
16         t = threading.Thread(target=increase)
17         t.start()
18     # 现在是5个线程同时在访问m,当所有的线程都开启以后,操作系统会将他们放入一个轮询队列中去并发执行(每个线程分配一个时间片)。
19     # 当循环次数较少(执行这个线程用的时间越少),使用的时间不足以超出时间片,如果时间过长(即耗时任务)就会超出时间片,就会进而让出cpu
20 
21 
22 if __name__ == '__main__':
23     conflict()
1 运行结果:
2 """
3   100
4   200
5   300
6   400
7   500
8 """
  • 出现线程冲突
 1 import threading
 2 
 3 m = 0
 4 # 如果多个线程去操作同一个外部资源,完成这个任务所花的时间远远超出线程的时间片。此线程还没有完成对此外部资源的操作,其他资源就来操作了,那么就可能造成线程的不安全。
 5 # 多个线程同时访问同一个外部资源,就可能会会出现读写冲突
 6 def increase():
 7     global m
 8     for i in range(1000000): # 循环次数多,出现问题
 9         m += 1
10     print(m)
11 
12 # 线程冲突
13 def conflict():
14     # 创建5个线程,这5个线程同时的去操作外部的m变量
15     for _ in range(5):
16         t = threading.Thread(target=increase)
17         t.start()
18     # 现在是5个线程同时在访问m,当所有的线程都开启以后,操作系统会将他们放入一个轮询队列中去并发执行(每个线程分配一个时间片)。
19     # 当循环次数较少(执行这个线程用的时间越少),使用的时间不足以超出时间片,如果时间过长(即耗时任务)就会超出时间片,就会进而让出cpu
20 
21 
22 if __name__ == '__main__':
23     conflict()
 1 运行结果:
 2 """
 3 1554797
 4 1765071
 5 1850168
 6 1916170
 7 2079668
 8 """
 9 
10 # ------------------- 运行结果出现错误-----------------------

解决办法

  • 使用线程同步

 1 import threading
 2 
 3 m = 0
 4 # 如果多个线程去操作同一个外部资源,那么就可能造成线程的不安全。
 5 # 多个线程同时访问同一个外部资源,就可能会会出现读写冲突
 6 def increase():
 7     global m
 8     for i in range(1000000): # 循环次数少,不会出现问题
 9         m += 1
10     print(m)
11 # 加入线程同步来解决线程冲突
12 def threadSync():
13     for _ in range(5):
14         t = threading.Thread(target=increase)
15         t.start()
16         # 将线程加入同步对列。。但线程同步会造成线程的阻塞
17         t.join() # 同步就是串行,将所有的任务加入到同一个同步队列中,前面的任务不执行完后面的不能开启
18 
19 if __name__ == '__main__':
20 
21     threadSync()
  • 给资源加互斥锁 [只有读或只有写操作加互斥锁]
 1 import threading
 2 
 3 m = 0
 4 lock = threading.Lock()  # 创建一个互斥锁,不会造成线程阻塞问题
 5 def increase2():
 6     global m
 7     if lock.acquire(): # 获取互斥锁,并作出判断
 8         for i in range(1000000):
 9             m += 1
10         print(m)
11     lock.release()  # 使用完毕以后解除互斥锁
12     print("我是线程:",threading.current_thread().name)
13 
14 def threadLock():
15     for _ in range(5):
16         t = threading.Thread(target=increase2)
17         t.start()
18 
19 if __name__ == '__main__':
20     threadLock()
21 
22 # -------------- 正常输出结果 ---------------

 

转载于:https://www.cnblogs.com/TMMM/p/11379090.html

ch8 进程和线程-单元测试【答案+部分解析】第1关:ch8 进程和线程-单元测试-基础 + 第2关:ch8 进程和线程-单元测试-提高 + 第3关:ch8 进程和线程-单元测试-进阶 阅读详情

相关推荐

保姆级教程:用Ubuntu 22.04搭建RustDesk中继服务器(含Cloudflare避坑指南)

本教程详细指导如何在Ubuntu 22.04上搭建RustDesk中继服务器,解决跨国远程协作的延迟问题。涵盖环境配置、Rust编译优化、服务部署及Cloudflare代理设置等关键步骤,帮助用户实现高性能的私有中继服务。

weixin_29002209的博客 527

android进程与线程详解三:线程安全和进程间通信

线程安全 在某些情况下,你实现的方法可能会在不同的线程中调用,所以它们必须被实现成“线程安全的”。 这首先体现在可以远程调用的方法上—比如在boundservice中的方法。当在一个进程中调用同一个进程中的IBinder上所实现的方法时,这个方法会在调用者的线程中运行...

chenqunan3231的博客 64

使用python获取同花顺免费版和同花顺远航版自选股数据用于量化交易

在做量化交易时,有时需要在盘中实时监控同花顺自选股的数量,以便灵活地自定义提醒、捕捉买卖时点等。那么,如何使用python获取同花顺自选股数据呢?

tzzqn2008的专栏 3682

java基础语法(三十六)线程和进程(三)——线程安全

关于多线程并发环境下,数据的安全问题. 1.1.为什么这个是重点? 以后在开发中,我们的项目都是运行在服务器当中, 而服务器已经将线程的定义,线程对象的创建,线程 的启动等,都已经实现完了.这些代码我们都不需要 编写. 最重要的是:你要知道,你编写的程序需要放到一个 多线程的环境下运行,你更需要关注的是这些数据 在多线程并发的环境下是否是安全的。(重点: ***) 1.2、什么时候数据在多线程并发的环境下会存在安全问题呢? 同时满足三个条件: 条件1:多线程并发。 条

Apikaqiu的博客 421

ros2的unity仿真配置(ros2-for-unity)

可以看到unity中输出了Hello World,验证完毕!可以看到unity上监听的/chatter。

m0_63671696的博客 4093

27-eMMC电路设计

eMMC硬件电路设计

weixin_66510961的博客 4008

【Java并发知识总结 | 第七篇】Java并发相关概念总结(程序/进程/线程、并行/并发、同步/异步、死锁/避免、线程安全/三大特性)

Java并发相关概念总结(程序/进程/线程、并行/并发、同步/异步、死锁/避免、线程安全/三大特性)

踢桃的成长之路 1979

【理解机器学习算法】之岭回归Ridge - L2 Rgularization

本人就职海外从事人工智能领域开发设计。 希望花时间总结下流行的机器学习算法,希望大家一起学习,欢迎指正!

Hyman Qiu 2317

Java线程安全问题理解

进程 电脑会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。如下图中的Chrome浏览器等等。 线程 进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 串行:其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,也就是说,必...

Hern(宋兆恒) 9627

【寄存器模型】二、前门访问与后门访问

1.后门访问可以更好的完成前门访问能够完成的事情:后门访问不消耗仿真时间,且消耗的运行时间也远小于前门访问的运行时间。 2.后门访问可以完成前门访问不能完成的事:对于某些特定的场景,如网络通信系统中的一些只读计数器,当要验证计数器进位归零的场景时,前门访问无法完成写寄存器操作,只能通过消耗仿真时间来使计数器到达特定的计数值。而后门访问可以直接对只读寄存器赋一个初值......

carrotbanana的博客 9657

【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?

本文介绍了Halcon中为XLD轮廓模板添加极性信息的实用技巧。通过先以"ignore_local_polarity"模式创建模板,首次匹配获得位置后,使用set_shape_model_metric运算符结合真实图像为模板注入极性信息(边缘明暗方向)。这种方法弥补了XLD模板初始不支持极性的缺陷,可显著提升后续匹配的精度和抗干扰能力。实验显示,添加极性信息后的模板匹配效果明显优于无极性的匹配结果。该技术特别适用于基于手动绘制或处理后的XLD轮廓创建模板的场景。

songhuangong123的博客 751

进程和线程、线程安全

进程和线程 一个程序就是一个进程,而一个程序中的多个任务则被称为线程。 进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位。 实现多线程编程的方式有两种,一种是继承 Thread 类,另一种是实现 Runnable 接口。使用继承 Thread 类创建线程,最大的局限就是不能多继承,所以为了支持多继承,完全可以实现 Runnable 接口的方式。需要说明的是,这两种方式在工作时的性质都是一样的,没有本质的区别。 虽然系统是把资源分给进程,但是CPU很特殊,是被分配到

qq_36930483的博客 732

【数据湖仓】:Iceberg、Hudi 和 Paimon 对比

适用于需要多计算引擎支持和复杂查询的离线批处理场景。其中立性和灵活性使其成为构建新型数据平台的理想选择。:在需要高频数据更新和高效小文件管理的场景中表现出色,适合实时数据处理和增量数据更新的业务需求。:专为实时流式数据处理设计,适用于对数据实时性要求高的业务场景,如实时数据分析和实时指标监控。通过以上分析,可以看出 Apache Iceberg、Apache Hudi 和 Apache Paimon 各有其独特的优势和适用场景。企业应根据自身业务需求和技术栈选择合适的数据湖仓方案,以充分发挥其价值。

欢迎来到我的博客,一起探索代码里的世界! 1610

4种解决线程安全问题的方式

前言 线程安全问题,在做高并发的系统的时候,是程序员经常需要考虑的地方。怎么有效的防止线程安全问题,保证数据的准确性?怎么合理的最大化的利用系统资源等,这些问题都需要充分的理解并运行线程。当然关于多线程的问题在面试的时候也是出现频率比较高的。下面就来学习一下吧! 线程 先来看看什么是进程和线程? 进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。就

一步一脚印的博客 7324

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

线程安全

本文转载自https://yq.aliyun.com/articles/665498/ 目录 1、什么是进程? 2、什么是线程? 3、什么是多线程? 4、什么是线程安全? 记得今年3月份刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题,说你给我说说有哪些线程安全的类,我心里一想,呵呵,这我早都背好了,稀里哗啦说了一大堆,那你再来说说什么是线程安全,然后就GG了,说真的,我们...

Shawn的博客 953

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

什么是进程、线程、线程安全?以及之间的关联关系

在探讨线程安全之前,我们先来聊聊什么是进程。 一、什么是进程? 电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如下图中的QQ、酷狗播放器、电脑管家等等。 2、什么是线程? 进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 那什么是多线程?提到多线程这里要说两个概念,就是串行和并行,搞清楚

一名后端程序猿 697

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

谈谈对进程,线程,线程安全和线程状态的理解

谈谈对进程,线程,线程安全和线程状态的理解 进程 进程是指一种正在运行的程序,有自己的地址空间. 进程的特点 动态性 并发性 独立性 并行和并发的区别 并行: 在同一个时刻,有多个指令在多个处理器上同时执行---------多个CPU同时执行多个任务 并发: 在同一个时刻只能有一条指令执行,但多个进程指令被快速的轮换执行---------一个CPU(采用时间片)同时执行多个任务 线程 线...

weixin_43666051的博客 649

简述进程、线程、多线程和线程安全问题

简述进程、线程、多线程和线程安全问题1. 什么是进程2. 什么是线程3. 什么是多线程4. 如何实现多线程5. 什么是线程安全问题6. Java如何解决线程安全问题 1. 什么是进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位。例如:一个软件,在操作系统中,运行时,我们称其为进程。 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。 2. 什么是线程 在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划分

weixin_44356108的博客 684

JAVA——线程(线程和进程,线程安全)

线程的处理 CPU在某一时刻只能处理一个线程中的一个指令,CPU内核会在多个线程间来回切换运行,切换速度非常快,就像同时运行的一样,但是这意味着会出现线程安全问题。 CPU在多个线程间切换,可能导致某些重要的指令不能完整执行,此时如果CPU切换到的另一个线程对前一个线程使用的数据操作,就会造成数据出错,那么如何在程序中保证线程安全? 在Java中我们通过同步机制,来解决线程安全问题 同步的方式—操作代码块的同时,只能一个线程参与,其他线程等待,相当于一个单线程的过程。效率较多线程低 方法一:同步代码块 sy

m0_45147931的博客 2377

线程与线程安全

非运行:代码文件 + 资源文件运行:正在运行的程序 - 进程通过(代码-计算机硬件设备指令集)调用计算机资源(CPU+RAM+IO)解决问题线程安全问题指的是:不同线程 同时 访问修改 相同的数据 造成数据更新不及时@Overridei < 10000;r1.start();r2.start();r3.start();r2.join();r3.join();

2301_81663239的博客 754

一文教会你什么线程安全以及如何实现线程安全

title: 一文教会你什么线程安全以及如何实现线程安全 tags: 线程安全 Java并发 Java内存模型 synchronized volatile Lock 文章目录一、线程安全的概念二、导致线程不安全的原因三、线程安全问题3.1 原子性3.2 可见性3.3 有序性案例:抢票四、如何确保线程安全?4.1 synchronized关键字4.1.1 同步代码块4.1.2 同步函数4.1.3 多线程死锁线程4.2 Lock4.3 volatile关键字解决办法:4.4 synchronized、vol.

qq_39350172的博客 2756
上一篇: 进程_线程 之(二) --- 进程线程
下一篇: 进程_线程 之(四) --- 信号量和队列
baoding4359
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值