多线程锁的问题,怎么总是锁不住呢
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: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]