首页 > 其他分享 >线程间通信

线程间通信

时间:2022-11-19 23:01:32浏览次数:39  
标签:共享资源 lock 间通信 死锁 线程 操作 上锁

---线程由于是在同一个进程中,所以线程间通信使用全局变量进行通信

 

共享资源:

多个线程都可以操作的资源为共享资源,对共享资源的操作代码段称为临界区。对共享资源的无序操作可能会带来数据的混乱,或者操作错误。此时往往需要同步互斥机制协调操作顺序。

--同步机制:比如消息队列,管道就属于同步机制

 

 

 

 

 

--互斥机制:

  互斥使用的方法:

  ----Event()方法  

  e = Event() 创建线程event对象
  e.wait([timeout]) 阻塞等待e被set
  e.set() 设置e,使wait结束阻塞
  e.clear() 使e回到未被设置状态
  e.is_set() 查看当前e是否被设置

from threading import Thread,Event
from time import sleep
s = None #用于通信
e = Event()     #事件对象
def fun():
    print('杨子荣前来拜山头')
    global s
    s = '天王盖地虎'
    e.set()
t = Thread(target=fun)
t.start()
print('说多口令就是自己人')
e.wait()            #必须先等子线程先操作完s,再进行验证
if s == '天王盖地虎':            #
    print('口令正确')
else:
    print('口令错误')
t.join()

  ---线程锁 

  即在对共享资源操作时,先进行上锁操作,不允许其他线程操作该变量,等本线程操作完成后,再解锁,供其他线程操作

  lock = Lock() 创建锁对象
  lock.acquire() 上锁 如果lock已经上锁再调用会阻塞
  lock.release() 解锁  
  with lock: 上锁
  ...
  ...
  with代码块结束自动解锁

'''线程锁
'''
from threading import Thread,Lock
from time import sleep
a = b = 0
lock = Lock()
def value():
    while True:
        lock.acquire()  #上锁
        if a != b:
            print('a=%d,b=%d'%(a,b))
        lock.release()  #解锁
t = Thread(target= value)
t.start()
while True:
    with lock:  #上锁
        a += 1
        b += 1
        #执行完后解锁
t.join()

 

线程死锁的问题:

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。

简单来说造成死锁的原因可以概括成三句话:
当前线程拥有其他线程需要的资源,
当前线程等待其他线程已拥有的资源,
都不放弃自己拥有的资源

 

标签:共享资源,lock,间通信,死锁,线程,操作,上锁
From: https://www.cnblogs.com/powfu/p/16907445.html

相关文章

  • 进程间通信
    ---pipe管道概念:在内存中开辟管道空间,生产一个管道对象,多个进程使用同一个管道'''管道通信multiprocessing中管道通信只能用于有亲缘关系进程中,即父子进程,兄弟进程2.......
  • 线程(Thread)基本用法
    一.线程的调用1.无参defrun_01():foriinrange(6,10):print("test01",i)time.sleep(1)th_01=threading.Thread(target=run_01)#创......
  • Python的线程如何理解
    Num01-->多线程threadingPython中建议使用threading模块,而不要使用thread模块。原因如下:1,Python中threading模块对thread进行了一些包装,可以更加方便的使用。2,Python......
  • 【JAVA】线程
    线程概念线程:程序进程:运行中的程序线程由进程创建,是进程的实体。一个进程可以有多个线程。单线程,多线程并发:同一时刻多个任务交替进行。单核cpu并行:同一时刻多个任......
  • C#新建和开启线程的Thread方法-扩展:C# 线程(Thread)
    https://blog.csdn.net/A080807/article/details/124483863https://www.cnblogs.com/HomeSapiens/p/16366835.htmlC#新建和开启线程的Thread方法第一步:使用System.Thr......
  • TransmittableThreadLocal传递ServletRequestAttributes对象在主线程和线程池,避坑指南
    关于HttpServletRequest对象在主线程和线程池传递过程的问题一,针对一般对象,解决主线程和线程池内线程对象解决方案是用阿里的插件TransmittableThreadLocal使用案例(1)将线程......
  • python-多线程
     首先了解多线程之前先科普一下并发以及并行的概念,这两者大家很容易混淆. 一,意思不同1、并发:并发是指两个或多个事件在同一时间间隔发生。2、并行:并行......
  • 习题,买车票 Runnable接口实现线程
    【代码】packagecom.msb.test03;importsun.security.krb5.internal.Ticket;/***@author:liu*日期:10:38:04*描述:IntelliJIDEA*版本:1.0*/publi......
  • 多线程第二种,实现Runnable接口
    packagecom.msb.test02;/***@author:liu*日期:10:27:43*描述:TestThread实现了这个接口,才会变成一个线程类*版本:1.0*/publicclassTestThreadimpl......
  • 14.多线程并发在电商系统下的追本溯源(1)
                                                         ......