当前位置: 首页 > news >正文

优秀网站共分享公司招聘信息

优秀网站共分享,公司招聘信息,中国商业网点,网站建设在整体布局有哪些要求什么是锁? 在多线程编程中,锁是一种机制,用来确保某些代码块在同一时间只能被一个线程执行。想象一下,你和你的朋友们都想同时进入一个只有一把椅子的房间。为了避免混乱,你们需要一个锁来控制进入的顺序。 普通锁&a…

什么是锁?

在多线程编程中,锁是一种机制,用来确保某些代码块在同一时间只能被一个线程执行。想象一下,你和你的朋友们都想同时进入一个只有一把椅子的房间。为了避免混乱,你们需要一个锁来控制进入的顺序。

普通锁(Lock)

普通锁就像是一个简单的门锁。你拿到钥匙(获取锁),进了房间(执行代码),然后记得把钥匙放回去(释放锁),这样别人才能进来。

让我们看看Python中的普通锁是如何工作的:

import threadinglock = threading.Lock()def critical_section():with lock:print(f"{threading.current_thread().name} has entered the critical section")# 模拟一些工作import timetime.sleep(1)print(f"{threading.current_thread().name} is leaving the critical section")threads = []
for i in range(3):thread = threading.Thread(target=critical_section)threads.append(thread)thread.start()for thread in threads:thread.join()

在这个例子中,我们创建了一个普通锁,并在critical_section函数中使用它。每个线程在进入关键区之前都会获取锁,并在离开时释放锁。这样可以确保同一时间只有一个线程在执行关键区的代码。

普通锁的死锁场景
普通锁虽然简单高效,但在某些情况下会导致死锁。让我们看看一个死锁的例子:

import threadinglock = threading.Lock()def deadlock_function():lock.acquire()print(f"{threading.current_thread().name} has acquired the lock")# 尝试再次获取同一把锁,导致死锁lock.acquire()print(f"{threading.current_thread().name} has acquired the lock again")lock.release()lock.release()thread = threading.Thread(target=deadlock_function)
thread.start()
thread.join()

在这个例子中,deadlock_function函数尝试两次获取同一把锁。第一次获取锁成功,但第二次获取锁时,由于锁已经被当前线程持有,导致死锁。程序会卡在第二次获取锁的地方,无法继续执行。

递归锁(Reentrant Lock)

递归锁就像是一个聪明的门锁,它知道你已经在房间里了,所以如果你再试图进入,它会让你进去,而不会把你锁在外面。这在递归函数或需要多次获取同一把锁的情况下特别有用。

让我们看看递归锁是如何工作的:

import threadingrlock = threading.RLock()def recursive_function(level):with rlock:print(f"{threading.current_thread().name} has entered level {level}")if level > 0:recursive_function(level - 1)print(f"{threading.current_thread().name} is leaving level {level}")thread = threading.Thread(target=recursive_function, args=(3,))
thread.start()
thread.join()

在这个例子中,我们使用了递归锁RLock。recursive_function函数会递归调用自己,并在每个递归层级获取同一把锁。递归锁允许同一个线程多次获取锁,而不会导致死锁。

递归锁 vs 普通锁

  • 普通锁:简单高效,但同一个线程不能多次获取同一把锁,否则会导致死锁。
  • 递归锁:允许同一个线程多次获取同一把锁,适用于递归调用或需要多次获取锁的情况,但开销稍大。

更清晰的案例

递归锁:

import threadingrecursive_lock = threading.RLock()def recursive_function(n):if n <= 0:returnrecursive_lock.acquire()print(f"Acquired lock, n={n}")recursive_function(n-1)recursive_lock.release()print(f"Released lock, n={n}")recursive_function(3)

输出:
Acquired lock, n=3
Acquired lock, n=2
Acquired lock, n=1
Released lock, n=1
Released lock, n=2
Released lock, n=3

普通锁:

import threadingrecursive_lock = threading.Lock()def recursive_function(n):if n <= 0:returnrecursive_lock.acquire()print(f"Acquired lock, n={n}")recursive_function(n-1)recursive_lock.release()print(f"Released lock, n={n}")recursive_function(3)

运行一天的输出:
Acquired lock, n=3

结论:

锁在多线程编程中是必不可少的工具。普通锁适用于简单的同步场景,而递归锁则在复杂的递归或多次锁定场景中大显身手。

http://www.yayakq.cn/news/590731/

相关文章:

  • 自己搭建一个网站需要多少钱?做网站的搜索引擎
  • 怎样做php网站网站怎么做搜索引擎才能收录
  • 建站之星网站模版商城南昌 网站建设
  • 韩国 网站 域名wordpress v2ex 设计
  • 有源码手机怎么搭建网站商城网站制作明细
  • 机关事业单位网站建设网站制作 flash 修改
  • 网站分析报告wordpress区块链游戏
  • 沈阳红方城网站建设wordpress自动判断当前分类并获取tag标签
  • 外国人在中国做美食视频网站注册公司费用有哪些
  • 如何查看网站服务器系统网站做301排名会掉
  • 如何自己建一个微网站济南电子商务网站开发
  • 做网站客户东莞市路桥所
  • 网站开发常用js函数做化学科普网站的目的
  • 什么网站专做宠物物品wordpress分页标题
  • 哪些国家网站无须备案wordpress 去优酷广告插件
  • 服装设计网站知乎图怪兽作图神器下载
  • 西安到北京的高铁外贸 网站 seo
  • html怎么制作网页百度搜索结果优化
  • 南通网站定制搭建wordpress简单吗
  • 网页设计班级网站用什么做首页wordpress装修门户
  • 四川网站建设外包业务王磊网站建设
  • 域名注册网站 简称枣庄手机网站开发
  • 搬瓦工 建网站wordpress搬家换域名不换服务器
  • 最新网站开发工具wordpress无法访问图片
  • 梧州网站设计制作服务至上北京保障房建设网站
  • 南京触屏网站开发做私人网站
  • 国外企业合作的网站自己做网站需要学什么软件下载
  • 网站空间租用十大在线编程网站
  • 石材石料网站搭建教程百度网盘优化
  • 在灵璧怎样做网站网站统计代码放哪里