鱼C论坛

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

[已解决]多线程锁的问题,怎么总是锁不住呢

[复制链接]
发表于 2021-5-5 20:36:52 | 显示全部楼层 |阅读模式

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

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

x
def c(j):
        global lock
        lock = threading.Lock()
        if lock.locked()!=1:#如果没有锁定
                lock.acquire()#加锁
                for i in range(30):
                        print("{}执行看看效果{}".format(j,i))
                if lock.locked()==1:#如果已经加锁了,这里解锁
                    lock.release()

tt1 = threading.Thread(target=c, args=(1,))
tt1.start()
tt2 = threading.Thread(target=c, args=('...........',))
tt2.start()
tt3 = threading.Thread(target=c, args=('aaaaaaaaaaaaa',))
tt3.start()

我进循环就先判断是否有锁,没有就加锁,然后执行完循环后解锁,再给另一个线程使用,为啥实际输出结果和没有加锁的效果完全一样呢?我看了下锁定的状态,用print(lock)看到在加锁前就有3个线程进来,而加锁后也是有3个线程都在for循环里,我到底是哪里做的不对呢
最佳答案
2021-5-5 21:23:45
本帖最后由 suchocolate 于 2021-5-5 21:28 编辑

锁是全局对象,正常不需要检测有没有锁。你的代码里的锁是函数里临时创建的私锁,没有效果。
别的书里的案例,供参考:
  1. from threading import Thread, Lock
  2. import time

  3. n = 100   # 全局变量,多个进程一起修改它。

  4. def task():
  5.     global n
  6.     mutex.acquire()    # 给公锁上锁
  7.     temp = n
  8.     time.sleep(0.1)
  9.     n = temp - 1
  10.     print('购买成功,剩余%d张电影票' % n)
  11.     mutex.release()


  12. if __name__ == '__main__':
  13.     mutex = Lock()    # 创建公共锁对象
  14.     t_l = []
  15.     for i in range(10):
  16.         t = Thread(target=task)
  17.         t_l.append(t)
  18.         t.start()
  19.     for t in t_l:
  20.         t.join()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-5 21:23:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2021-5-5 21:28 编辑

锁是全局对象,正常不需要检测有没有锁。你的代码里的锁是函数里临时创建的私锁,没有效果。
别的书里的案例,供参考:
  1. from threading import Thread, Lock
  2. import time

  3. n = 100   # 全局变量,多个进程一起修改它。

  4. def task():
  5.     global n
  6.     mutex.acquire()    # 给公锁上锁
  7.     temp = n
  8.     time.sleep(0.1)
  9.     n = temp - 1
  10.     print('购买成功,剩余%d张电影票' % n)
  11.     mutex.release()


  12. if __name__ == '__main__':
  13.     mutex = Lock()    # 创建公共锁对象
  14.     t_l = []
  15.     for i in range(10):
  16.         t = Thread(target=task)
  17.         t_l.append(t)
  18.         t.start()
  19.     for t in t_l:
  20.         t.join()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 04:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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