import threading
a, b = 10, 10
finished = False
def thr():
global finished
while True:
# if sequence unpacking and assignment is atomic then (a, b) will always
# be either (10, 10) or (20, 20). Could also just check for a != b
if (a, b) in [(10, 20), (20, 10)]:
print('Not atomic')
finished = True
break
t = threading.Thread(target=thr)
t.start()
while True:
for i in range(1000000):
a, b = 20, 20
a, b = 10, 10
if finished:
t.join()
break
在多线程环境中绝对不是原子的,使用以下脚本测试:
使用CPython 2.6、2.7和3.2进行测试。在每一个版本中,这个脚本都会打印“Not atomic”,并在不到一秒钟的时间内退出。在
这是一个操作;在应用左手赋值之前,先对右手表达式求值:
或者,如果您谈论的是多线程环境,那么赋值是而不是原子的;解释器使用单个操作码计算元组赋值,但使用单独的操作码将结果存储到每个受影响的变量中:
^{pr2}$然而,正常的赋值总是至少有两个操作码(一个用于右手表达式,一个用于存储结果),因此在python中通常赋值不是原子的。顺序解包也没什么不同。在
相关问题 更多 >
编程相关推荐