首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原子操作:幕后操作

原子操作:幕后操作
EN

Stack Overflow用户
提问于 2011-07-29 02:08:25
回答 3查看 7.3K关注 0票数 9

原子操作是如何在幕后工作的?

原子操作是所谓的“无等待”吗?

我正在寻找原子操作的“最小公约数”的描述。所有的原子操作共享什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-29 02:20:53

原子性作为一个概念出现在多个地方,我怀疑您正在考虑代码中的原子操作,但还有其他含义。

数据库事务的一个基本属性是原子性,请参阅事务的ACID属性说明。

在这种情况下,您有很多数据库智能、锁等等,这几乎肯定意味着当两个控制线程(或两个进程)想要获取相同的数据时需要等待。

当你提到代码行时,我猜你在想一个声明(用一些虚构的语言)

代码语言:javascript
复制
global int x = 7;

在一个线程中

代码语言:javascript
复制
 x = 25000;

 print x;

而在另一个地方

代码语言:javascript
复制
 print x;

我们能说一些关于第二个线程将打印什么的内容吗?我们可能接受7或25000,但如果得到的数字是25,000的高位字节和7的低位字节,我们就不太高兴了--从概念上讲,这是非原子整数赋值的结果。

Java同步关键字。

票数 4
EN

Stack Overflow用户

发布于 2011-07-29 02:22:26

如果我们讨论的是由同步机制(互斥、信号量等)使用的原子操作,那么它们必须由单CPU机器上的操作系统和多CPU机器上的硬件支持。

在单CPU机器上,指令序列可以是“原子的”,因为如果中断被关闭,它就不能在中间中断(例如,定时器中断,它给出一个切换到另一个线程)。这意味着,一旦CPU进入内核模式,就可以非常简单地编写同步原语,并且可以访问中断控制寄存器。

在多核机器中,它更为复杂。然后,指令必须是真正的原子指令,跨所有CPU。这需要所有CPU,而不仅仅是执行原子指令的CPU,将其缓存的相关部分刷新到RAM。这种刷新使得同步在这些架构上变得如此昂贵。

指令本身在一次操作中采取“位测试和设置”的形式。这足以实现一个简单的互斥锁。即使不同CPU/核心上的两个线程在同一时间对同一地址执行测试和设置操作,也只有一个线程会得到该位未设置而现在已设置的结果。这个线程就是拥有互斥锁的那个线程。

票数 11
EN

Stack Overflow用户

发布于 2011-07-29 02:13:07

这取决于你所说的原子操作。如果你谈论的是ISA级的东西,我想在一些流行的ISA中包含了“测试和设置”指令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6863612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档