如果创建了多个锁定实例,Python 线程中的变量锁定无法锁定



我是线程新手,有一个问题。

from threading import Thread, Lock
s=0
lock =Lock()  ---->lock object position
def sample():
global s
for i in range(10000):
    lock.acquire()
    s+=1
    lock.release()    
t1 = Thread(target=sample)
t2 = Thread(target=sample)
t1.start()
t2.start()
t1.join()
t2.join()
print s

此代码给出的预期结果为 20000,因为对变量 s 的操作是以原子方式完成的。

但是当我更改 lock(( 创建位置时,锁没有按预期工作。我变了,就像

 from threading import Thread, Lock
    s=0    
    def sample():
        lock =Lock()  ---> lock() added inside function
        global s
        for i in range(10000):
            lock.acquire()
            s+=1
            lock.release()    
    t1 = Thread(target=sample)
    t2 = Thread(target=sample)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print s

通过此更改,我得到的值不一致。所以我猜锁在这里不起作用。有人可以帮助我理解基于此示例的锁定工作吗?
只有当两个线程使用相同的锁定对象时,才会支持锁定吗?

蒂亚

在第一个版本中,Lock 是在线程启动之前创建的,并且是两个线程都可用的全局变量。因此,这个单个锁对象在线程之间共享。 锁定对象一次只允许一个线程获取它。 在获取它时,调用.acquire()的另一个线程将阻塞,直到另一个线程调用.release()。 正如您所指出的,您的代码按预期工作。

在第二个版本中,当您将 Lock 创建作为局部变量移动到线程函数中时。 因此,每个线程调用不同的sample运行,从而创建一个唯一且不同的lock对象。 每个线程始终能够获取局部lock变量而无需等待,因为另一个线程始终获取另一个锁。 因此,s变量并没有真正受到保护。

最新更新