鱼C论坛

 找回密码
 立即注册
查看: 2333|回复: 1

多个线程锁

[复制链接]
发表于 2020-10-20 13:00:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 新学 于 2020-10-20 13:29 编辑

为什么多把锁反而无法禁止线程的切换


  1. from threading import Thread, Lock, enumerate

  2. # 共用一把锁
  3. lock = Lock()
  4. class Sum1(Thread):
  5.     sum = 0
  6.     def __init__(self, n):
  7.         super().__init__()
  8.         self.n = n

  9.     def run(self):
  10.         for i in range(self.n):
  11.             lock.acquire()  # 上锁,上锁后禁止cpu切换线程
  12.             Sum1.sum += 1
  13.             lock.release()  # 开锁,允许cpu切换线程
  14.         print(Sum1.sum)


  15. # 多个锁:每个对象都用自己的锁
  16. class Sum2(Thread):
  17.     sum = 0
  18.     def __init__(self, n):
  19.         super().__init__()
  20.         self.n = n

  21.     def run(self):
  22.         lock1 = Lock()  # 用自己的锁
  23.         for i in range(self.n):
  24.             lock1.acquire()  # 上锁,上锁后禁止cpu切换线程
  25.             Sum2.sum += 1
  26.             lock1.release()  # 开锁,允许cpu切换线程
  27.         print(Sum2.sum)

  28. def main():
  29.     n = 100000

  30.     t1 = Sum1(n)  # Sum1公用一把锁
  31.     t2 = Sum1(n)
  32.     t3 = Sum1(n)

  33.     # t1 = Sum2(n) # Sum2对象用自己的锁
  34.     # t2 = Sum2(n)
  35.     # t3 = Sum2(n)

  36.     t1.start()
  37.     t2.start()
  38.     t3.start()


  39. if __name__ == '__main__':
  40.     main()


  41. """
  42. 运行结果:
  43. 共用一把锁时:
  44. 261921
  45. 285610
  46. 300000
  47. 多把锁时: # 随机的数据 线程在被锁住的地方切换了
  48. 194130
  49. 199063
  50. 225863
  51. """
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-1 04:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表