鱼C论坛

 找回密码
 立即注册
查看: 1330|回复: 4

多线程锁的问题

[复制链接]
发表于 2019-6-16 23:25:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 万中山 于 2019-6-16 23:26 编辑

  1. import threading

  2. x = 100
  3. lock = threading.Lock()

  4. def run(num,conter):
  5.     global x
  6.     #lock.acquire()  # [color=Red]当把锁放外面的时候就正常[/color]
  7.     for i in range(conter):
  8.         lock.acquire()  # 进程获得锁
  9.         x = x+num
  10.         x = x-num
  11.         lock.release()  # 线程释放锁
  12.         if x != 100:
  13.             print(x)
  14.             break
  15.     #lock.release()  

  16. if __name__ == '__main__':
  17.     t1 = threading.Thread(target=run,args=(100,50000))
  18.     t2 = threading.Thread(target=run,args=(100,50000))

  19.     t1.start()
  20.     t2.start()
  21.     t1.join()
  22.     t2.join()

  23.     print('{}线程结束...'.format(threading.current_thread().getName()))
复制代码


今天在学习多线程的时候,看到锁这章,代码如上,当我把获取锁和释放锁放在循环内部的时候,if语句还是会执行,
也就是说,当多个线程在同时访问全局变量x的时候,加了锁,还是会出现数据安全问题。
然后我想了想,就把获取锁和释放锁放到循环外边,结果就不会执行if语句里面的内容了。

想问下是为什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-17 09:42:37 | 显示全部楼层
我试了下,if x != 100:这句是不是有问题。
我改成x == 100两个都会打印,!=时两个都不打印。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-17 15:52:43 | 显示全部楼层
加锁的话,放外面放里面都一样的吧,x = x+num, x = x-num,x的值一直都是不变的,if语句应该都不会执行吧,都是遍历完5万次后线程结束主线程
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-18 01:34:29 | 显示全部楼层
快速收敛 发表于 2019-6-17 15:52
加锁的话,放外面放里面都一样的吧,x = x+num, x = x-num,x的值一直都是不变的,if语句应该都不会执行吧 ...

加锁语句放到for里面  多次执行的话 会执行的if语句
锁放到外边就是我注释的位置,就执行不到if语句
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-18 01:35:42 | 显示全部楼层
hjx123hjx 发表于 2019-6-17 09:42
我试了下,if x != 100:这句是不是有问题。
我改成x == 100两个都会打印,!=时两个都不打印。

我就是不要执行if语句。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 10:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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