变量交换是否保证在python中是原子的?

变量交换是否保证在python中是原子的?,第1张

变量交换是否保证在python中是原子的?

让我们来看看:

>>> x = 1>>> y = 2>>> def swap_xy():...   global x, y...   (x, y) = (y, x)... >>> dis.dis(swap_xy)  30 LOAD_GLOBAL   0 (y)   3 LOAD_GLOBAL   1 (x)   6 ROT_TWO     7 STORE_GLOBAL  1 (x)  10 STORE_GLOBAL  0 (y)  13 LOAD_ConST    0 (None)  16 RETURN_VALUE

它不会出现,他们是原子:x的和y的值可以被另一个线程之间改变

LOAD_GLOBAL
字节码,之前或之后
ROT_TWO
,和之间的
STORE_GLOBAL
字节码。

如果要原子交换两个变量,则需要一个锁或一个互斥锁。

对于那些需要经验证明的人:

>>> def swap_xy_repeatedly():...   while 1:...     swap_xy()...     if x == y:...       # If all swaps are atomic, there will never be a time when x == y....       # (of course, this depends on "if x == y" being atomic, which it isn't;...       #  but if "if x == y" isn't atomic, what hope have we for the more complex...       #  "x, y = y, x"?)...       print 'non-atomic swap detected'...       break... >>> t1 = threading.Thread(target=swap_xy_repeatedly)>>> t2 = threading.Thread(target=swap_xy_repeatedly)>>> t1.start()>>> t2.start()>>> non-atomic swap detected


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5644814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存