首页 > 其他分享 >线程安全问题

线程安全问题

时间:2023-04-28 09:35:51浏览次数:37  
标签:__ Thread t2 t1 问题 安全 num 线程

线程安全问题

一、造成线程安全问题的原因:

GIL全局解释器锁

每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说python的多线程并不是真正意义上的同时执行。

image-20210723154134438

二、多线程共享全局变量

Python多线程是通过threading模块来实现的。

在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据。

from threading import Thread
 
list_a = [1, 2, 3]
 
def add_list():
    global list_a
    list_a.append(100)
    print(list_a)
 
if __name__ == '__main__':
    t1 = Thread(target=add_list)
    t2 = Thread(target=add_list)
    print(t1.name)
    t1.start()
    print(t2.name)
    t2.start()
    
Thread-1
[1, 2, 3, 100]
Thread-2
[1, 2, 3, 100, 100]

三、多线程的资源竞争问题(线程非安全)

在多个线程对全局变量进行修改时,造成得到的结果不正确,这种情况就是线程安全问题。

from threading import Thread

num = 0

def run1():
    global num
    for i in range(1000000):
        num += 1

def run2():
    global num
    for i in range(1000000):
        num += 1

if __name__ == '__main__':
    t1 = Thread(target=run1,name="t1")
    t2 = Thread(target=run2,name="t2")
    t1.start()
    t2.start()
    print(num)

运行结果 :748795  每次还都不相同

四、怎么解决多线程竞争问题?---最简单的同步机制是使用互斥锁

#	某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改。直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行操作,从而保证了多线程情况下数据的正确性。

*注意:
	多个线程使用的是同一个锁,如果数据没有被锁锁上,那么acquire()方法不会堵塞,会执行上锁操作。如果在调用acquire时,数据已经被其他线程上了锁,那么acquire()方法会堵塞,直到数据被解锁为止。
    
    
*上锁解锁过程:
"""
1、当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。
2、每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“阻塞”,直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。
3、线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。
"""
from threading import Thread, Lock, enumerate
import time
 
 
num = 0
mutex = Lock()
 
 
def add_num():
    global num
    for i in range(100000):
        mutex.acquire()
        num += 1
        mutex.release()
 
 
if __name__ == '__main__':
    t1 = Thread(target=add_num)
    t2 = Thread(target=add_num)
    t3 = Thread(target=add_num)
    t1.start()
    t2.start()
    t3.start()
 
    while len(enumerate()) != 1:
        time.sleep(1)
    print(num)

五、死锁及解决方法

python中在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁,因为系统判断这部分资源都正在使用,所有这两个线程在无外力作用下将一直等待下去。

为了支持在同一线程中多次请求同一资源,python提供了"递归锁":threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次acquire。直到一个线程所有的acquire都被release,其他的线程才能获得资源。

作者:钱煜

标签:__,Thread,t2,t1,问题,安全,num,线程
From: https://www.cnblogs.com/DTCLOUD/p/17360946.html

相关文章

  • 进程与线程
    进程和线程都是操作系统中的概念,它们是操作系统调度和管理计算机资源的基本单位。进程(Process)是指正在运行中的程序,它是系统资源分配和调度的基本单位。一个进程可以包含多个线程,每个线程都运行在同一个进程的上下文中,共享该进程的内存空间、文件等系统资源。操作系统通过进程间......
  • 11.solidworks零件另存后与工程图关联,工程图与零件关联问题
    一.工程图与零件关联1.不要打开零件情况下,点击打开 2.点击对应的工程图不要打开,点击下面的参考3.点击左边的零件去找到新的对应零件即可 4.完成 二、零件与工程图关联 工程图与零件的名称完全一直就会被关联......
  • 14.三色球问题
      流程图: 代码:#include<stdio.h>voidmain(){ /* 三色求问题: 一个口袋中有12个球已知其中3个是红的3个是白的 6个是黑的先从中任取8个问共有多少种可能的搭配 编程思路:因为最多取出8个所以红色我们最多取出3个 红色:[0-3]这个范围 白色:[0-3]也是......
  • c#线程安全
    引用:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/locklock语句获取给定对象的互斥lock,执行语句块,然后释放lock。持有lock时,持有lock的线程可以再次获取并释放lock。阻止任何其他线程获取lock并等待释放lock。lock语句可确保......
  • 我喜欢 Python,因为它可以帮助我回答小问题
    5-10行代码可能非常有用一遍又一遍,我看到这个教训适用。只需几行Python就可以让我的生活更轻松或回答一个简单的问题。养成用代码快速回答自己的好奇心的习惯。它将使您成为更好的开发人员,并且您会在此过程中获得很多乐趣!骰子分布今天早上,我在想棋盘游戏。在这个游戏中,您掷......
  • 记录一次git patch解析的问题
    因为工作需要对gitpatch内容进行解析,解析成文件及对应修改行、删除行的数据结构。gitpatch大概内容:点击查看代码commitmessage1commitmessage2diff--gita/file1.txtb/file1.txtindex1234567..abcdefg100644---a/file1.txt+++b/file1.txt@@-1,3+1,5@@l......
  • 线程暂停
    代码:namespaceThreadPause{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}ManualResetEventOnOff=newManualResetEvent(true);privatevoidForm1_Load(objectsende......
  • 进程和线程
    多线程的内容很重要;为了面试,时间不充裕就背,学习最重要没必要求大求全,把握核心和重点就OK;效率最高时间充裕除了背,需要慢慢自己做实现去理解;从大厂的一则招聘谈起:Java基础扎实,熟悉JVM、多线程、集合等基础,熟悉分布式、缓存、消息、搜索等机制三年以上Java开发经验,熟悉Spring......
  • 博客图片无法显示问题恢复
    最近忙昏头了,好久没看博客,今天打开一看,好嘛,图片怎么都不显示了???修复一下问题之前采用的都是csdn的免费编辑器,好用方便还有图床都不用直接弄,做完直接cv到各处都能用;这次原因是自己只弄了个免费图床存重要的头像和头图,然鹅那个图床更新了图片的链接,So,把更新的链接改到博客园后台......
  • js -- 跨域问题
    js--跨域问题  前言出于浏览器同源策略的影响,浏览器会阻止一个域的js脚本和另一个域的内容进行交互,因此产生了跨域问题,该问题也经常在面试和开发中遇到,本文来总结一下相关知识点。正文1、什么是同源策略因为浏览器出于安全考虑,存在同源策略,就是说如果......