2012-03-08 110 views
3

让我们假设在线程模块的python代码中有2个线程和一个全局变量。 在此代码中,只有线程1修改全局变量的值,而线程2只读取全局变量的值并根据该值执行其任务。在python的Threading模块下锁定全局变量

在这种情况下,我需要使用Lock()来保护对全局变量的访问吗?在C中,必须在这种情况下使用互斥锁。但是,GIL的python呢?它仍然是这样吗?是否仍然需要Lock()?

回答

8

将对象值赋给全局变量是Python中的一个原子操作。其他线程在分配时无法正确读取变量。 GIL在Python的C实现中保证了这一点,但其他实现可以以不同的方式做出相同的保证。

如果全局变量是一个可变对象,如列表,并且您正在修改该对象,则取决于您使用的方法。像列表这样的内建对象的大多数方法都是原子的。

虽然我不能确定您不需要锁,但不知道有关该变量用途的更多细节以及您如何使用它。为什么线程2需要根据该值更改其行为,如果线程1刚刚在线程2做出决定之后更改了值,那么它是否正常?如果不行,您可能仍然需要一个锁。

(在C类似的情况 - 将值分配给一个指针变量 - 也是在正常情况下的原子,虽然指针分配可以被重新排序可以使用此在某些情况下,以避免在C.锁。)