cdzjf 发表于 2021-5-5 20:36:52

多线程锁的问题,怎么总是锁不住呢

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循环里,我到底是哪里做的不对呢

suchocolate 发表于 2021-5-5 21:23:45

本帖最后由 suchocolate 于 2021-5-5 21:28 编辑

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

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

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


if __name__ == '__main__':
    mutex = Lock()    # 创建公共锁对象
    t_l = []
    for i in range(10):
      t = Thread(target=task)
      t_l.append(t)
      t.start()
    for t in t_l:
      t.join()
页: [1]
查看完整版本: 多线程锁的问题,怎么总是锁不住呢