并发编程中关于死锁,递归锁,信号量的理解

news/2025/2/25 16:02:18

并发编程中关于死锁,递归锁,信号量的理解

1.死锁****

​ 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁

​ 产生死锁的情况:1.对一把互斥锁加锁多次

​ 2.一个共享资源 要访问必须同时具备多把锁,但是这些锁被不同线程或进程所持有 , 就会导致相互等待对方释放 从而程序就卡死了

from threading import Thread,Lock
import time
mutexA=Lock()
mutexB=Lock()

class MyThread(Thread):
    def run(self):
        self.func1()
        self.func2()
    def func1(self):
        mutexA.acquire()
        print('\033[41m%s 拿到A锁\033[0m' %self.name)

        mutexB.acquire()
        print('\033[42m%s 拿到B锁\033[0m' %self.name)
        mutexB.release()

        mutexA.release()

    def func2(self):
        mutexB.acquire()
        print('\033[43m%s 拿到B锁\033[0m' %self.name)
        time.sleep(2)

        mutexA.acquire()
        print('\033[44m%s 拿到A锁\033[0m' %self.name)
        mutexA.release()

        mutexB.release()

if __name__ == '__main__':
    
    #同时开启10个线程
    for i in range(10):
        t=MyThread()
        t.start()


#Thread-1 拿到A锁
#Thread-1 拿到B锁
#Thread-1 拿到B锁(线程1执行完b上锁以后,睡眠2s后,但此时线程2率先抢到a锁,所以等进程2的a锁解开后,才能运行进程1中的fun2的a锁运行,但此时进程2中需要b锁,但进程1中的b锁并未解开,所以产生死锁)
#Thread-2 拿到A锁

2.递归锁

​ 特点:1.多线程之间都有互斥的效果,不同在于,同一个线程可以对同一个锁进行多次acquire

​ 2.同一个线程必须保证加锁和解锁次数相同,其他线程才能够抢到这把锁

3.信号量

​ 可以限制同时并发执行公共代码的线程数量,如果限制数量为1,则与普通互斥锁没有区别

from threading import Semaphore,current_thread,Thread
import time

s = Semaphore(2)#同一时间最大并发2个

def task():
    s.acquire()
    time.sleep(1)
    print(current_thread().name)
    s.release()
    
for i in range(10):
    Thread(target=task).start()
    
 # 注意:信号量不是用来解决安全问题的  而是用于限制最大的并发量

转载于:https://www.cnblogs.com/bruce123/p/11184412.html


http://www.niftyadmin.cn/n/4819020.html

相关文章

Ethereal使用入门

ethereal 可以用来从网络上抓包,并能对包进行分析。下面介绍windows 下面ethereal 的使用方法安装1)安装winpcap,下载地址http://netgroup-serv.polito.it/winpcap/install/Default.htm 2)安装ethereal ,下载地址http:…

select top 的用法

select top 1 * from 员工 order by 编号 select * from 员工 order by 编号 select * from 员工 where 编号 like YG% order by 编号 desc select TOP 1 * from 员工 where 编号 like YG% order by 编号 desc

用Ethereal分析协议数据包

Ethereal是一个图形用户接口(GUI)的网络嗅探器,能够完成与Tcpdump相同的功能,但操作界面要友好很 多。Ehtereal和Tcpdump都依赖于pcap库(libpcap),因此两者在许多方面非常相似(如都使…

程序信息网格

程序信息网格 尽量在item信息中完成一切。

python第四课

# li[alex,[1,2,3],wusir,egon,女神,taibai]# l1li[0]# print(l1)# l2li[1]# print(l2)# l3li[0:3]# print(l3)#li[alex,wusir,egon,女神,taibai]#增加append insert# li.append(日天)# li.append(1)# print(li)# while 1:# usernameinput(>>>)# if username.…

1. 单例模式

单例模式存在的意义 1. 一个class只有一个对象,减少了内存开支2. 避免对资源多重占用 适用于单例模式的场景 1. 频繁创建及销毁的对象,例如工具类 2. 不变的对象 3. 重量级对象,例如JDBC连接,httpClient等 单例模式的使用 1. 饿汉…

PAT乙级真题 | 1043 输出PATest

1043 输出PATest 给定一个长度不超过 1 的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下…

RTP:实时传输协议

实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RT…