|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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循环里,我到底是哪里做的不对呢
本帖最后由 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()
复制代码
|
|