Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python线程模块下的全局变量锁定_Python_Multithreading_Locking - Fatal编程技术网

python线程模块下的全局变量锁定

python线程模块下的全局变量锁定,python,multithreading,locking,Python,Multithreading,Locking,假设我有两个线程和一个全局变量,在一个带有线程模块的python代码中。 在这段代码中,只有线程1修改全局变量的值,而线程2只读取全局变量的值,并根据该值执行其任务 在这种情况下,是否需要使用Lock()保护对全局变量的访问?在C语言中,在这种情况下必须使用互斥。但是,使用GIL的python呢?还是这样吗?仍然需要Lock()吗?在Python中,将对象值分配给全局变量是一个原子操作。其他线程无法通过在赋值时读取变量来错误地读取变量。GIL在Python的C实现中保证了这一点,但是其他实现可以

假设我有两个线程和一个全局变量,在一个带有线程模块的python代码中。 在这段代码中,只有线程1修改全局变量的值,而线程2只读取全局变量的值,并根据该值执行其任务


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

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

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

但是,如果不知道该变量的用途以及如何使用它的更多细节,我不能肯定您不需要锁。为什么线程2需要根据该值更改其行为,如果线程1在线程2做出决定之后更改该值,那么可以吗?如果不行,您可能还需要一把锁

(C中的一种类似情况——为指针变量赋值——在正常情况下也是原子的,尽管指针赋值可以重新排序。在某些情况下,您可以使用这种方法来避免C中的锁。)