为什么原子操作被认为是线程安全的?

6

原子操作是如何实现线程安全的?我已经在维基百科有关线程安全的文章中阅读了相关内容。但该文章并没有真正解释背后的过程。换句话说,为什么线程A执行的“原子”操作不能被线程B打断?


7
嗯... 因为它是“原子级”的,也就是最小的可能单元,或者说是“不可分割的”... - K-ballo
它们并不能神奇地使你的程序具备线程安全性... - zch
3
真的吗?关闭了?人们甚至有没有“阅读”像“不是一个真正的问题”这样的原因? :-) 这似乎不属于“模糊、含糊、不完整、过于宽泛或修辞”的任何一种。 - paxdiablo
“@paxdiablo,‘我想知道原子操作为什么被认为是线程安全的’这句话有点令人困惑。但我同意重新打开投票。” - assylias
1
@assylias - 你说得有一定道理。但我认为这可能是因为楼主对英语掌握不够好。我们会尽量包容这种情况。(你也可以自由编辑问题的标题以消除混淆...) - Stephen C
显示剩余2条评论
3个回答

8

原子操作要么完成,要么完全未完成。其他线程将无法看到操作“正在进行”--它永远不会被视为部分完成状态。在这个上下文中,“原子”一词的含义就是这样。

使这个保证成立的后台魔术因实现而异。对于并发设计,您只能依赖于执行的全部或无事可做的保证。


我认为在这种情况下“原子”并不是指这个意思,在这种情况下操作总是完成的...但无论如何这都是离题了。 - K-ballo
1
@K-ballo,这可能是对答案意图的误解。我认为它并没有建议关系数据库的提交/回滚语义。原子操作要么未完成(之前),要么已完成(之后),不存在在操作进行到一半时进行线程切换的可能性。 - paxdiablo
@MelNicholson:是的,现在我明白你的意思了。 - K-ballo
@Mel Nicholson 谢谢兄弟,这正是我想要的。 - ayoubuntu

6
但他们并没有真正解释背后的过程,换句话说,为什么线程A执行的原子操作不能被线程B中断?
他们不解释背后的过程是因为这高度依赖于实现。例如,它取决于可用于在实现平台上执行此类操作的硬件指令。
但您不需要担心这个。您不应该关心原子性(例如非中断性)是如何实现的。您应该仅依赖于AtomicXxx类API提供的保证,即某些操作将以原子方式执行,并根据这些保证构建您的高级线程安全性。
但请注意,AtomicXxx类的原子性属性仅适用于单个操作。 AtomicXxx操作序列不会被原子地执行,因此不会自动成为线程安全。
简而言之,如果您使用AtomicXxx类来实现线程安全,则需要“了解您正在做什么”。

1

比较并设置是一条机器指令,因此不会被中断。

从这个意义上讲,所有的机器指令都是原子性的,这并不是很有趣。例如,简单的写操作总是原子性的。

“有趣”的原子操作是那些直观地由两个或多个步骤组成,但实现为一个不可分割的步骤,例如比较并设置;在32位机器上对长整型进行易失性读/写操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接