当我测试时
import threading
def job1():
global A
a = lock.acquire()
print(a)
for i in range(10):
A+=1
print('job1',A)
lock.release()
def job2():
global A
for i in range(10):
A+=10
print('job2',A)
if __name__== '__main__':
lock=threading.Lock()
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
大部分时间,结果是(条件1):
True
job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job1 8
job1 9
job1 10
job2 20
job2 30
job2 40
job2 50
job2 60
job2 70
job2 80
job2 90
job2 100
job2 110
但其中一个结果是(条件2)
True
job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job2 17
job2 27
job2 37
job2 47
job2 57
job2 67
job2 77
job2 87
job2 97
job2 107
job1 108
job1 109
job1 110
我应该将帖子锁定在job1
中,为什么结果2会出来?
如果我在lock.acquire
中添加了另一个lock.release
和job2
语句,我发现结果将始终为条件1,但为什么?
答案 0 :(得分:0)
Lock
实例中有一个线程安全的计数器,lock.acquire
表示如果计数器大于0,则传递,否则阻塞。 lock.release
表示counter = counter + 1
。
因此要同步两个线程,您需要在两个线程中使用锁定。如果job1
没有lock.release
,则计数器为0,lock.acquire
内的job2
将阻止,直到job1
调用lock.release
。
这就是锁定的基本工作方式。
除{strong>确实在其中使用锁之外,job2
内没有任何锁定。我知道你想要什么,你想要阻止job2
,直到job1
致电lock.release
。但是您需要通过调用job2
明确告诉lock.acquire
阻止。或者job2
如何知道自己应该被阻止?
更进一步,假设您有两个不同的锁实例a, b
和两对线程jobA1, jobA2, jobB1, jobB2
。您可以使用a
同步jobA1
和jobA2
,并使用b
同步jobB1
和jobB2
。但是你需要明确告诉每个线程他们应该使用哪个锁。