回答
原子性作为一个概念出现在好几个地方,我怀疑你想在代码中的原子操作,但也有其他的含义。数据库事务的
一个fundamantal属性是原子性,看到的交易ACID特性的描述。
在这种情况下,你有很多数据库聪明,锁具等,当两个控制线程(或两个过程)要在同样的数据,几乎可以肯定,意味着等待。
当你来到的代码,我猜你正在考虑一个报关行(在某些虚构的语言)在一个线程
x = 25000;
print x;
而在另一个
print x;
global int x = 7;
我们可以说什么第二个线程会打印什么?我们可能接受7或25000,我们不太乐意得到25,000的高位字节的数字和7的低位字节 - 这在概念上将是非原子整数分配的结果。
不同的编程语言可以自由定义他们希望的任何语义,可以想象有些人会接受他们工作的CPU的任何自然行为(比如32位int是原子的,64长的不是),或者他们可能会做某些事情更聪明,如果CPU本身不提供原子操作,那么如果他们想伪造原子性,我不会看到太多的替代方法 - 例如。 Java同步关键字。
如果我们谈论的是由同步机制(互斥,信号等),它们必须通过在单CPU机器上的操作系统和CPU的多硬件上支持使用原子操作。
在单个CPU机器上,如果中断被关闭,则指令序列可以被设置为“原子”,因为它不能在中间被中断(例如,定时器中断使另一个线程切换)。这意味着一旦CPU进入内核模式并且可以访问中断控制寄存器,就可以非常简单地写入同步原语。
在多核机器中它更复杂。然后,指令必须在所有CPU中都是真正的原子。这要求所有 CPU,不仅是执行原子指令的CPU,将其高速缓存的相关部分刷新到RAM。这种冲洗是在这些架构上使同步如此昂贵的原因。
指令本身采取“位测试和设置”的形式在一个操作中。这足以实现一个简单的互斥锁。即使不同CPU /内核上的两个线程正在同一地址上同时执行测试和设置操作,也只有一个线程会得到该位未设置且现在置位的结果。该线程是拥有互斥锁的线程。
我试图得到一个概念“最低公约数”的描述,但是谢谢你的回答。 – Pindatjuh
什么时候中断*被禁用?这实际上是否真的做到了?看起来像这样的机制将离开躺在用户空间是一件危险的事情。 –
@Brian:Interruts只能在内核空间中被禁用。在关键操作期间它们通常在内核中被禁用,并再次被重新启用。最常见的情况是每当中断处理程序运行时自动屏蔽掉较低优先级的中断。 –
- 1. 覆盖Rails引擎控制器操作
- 2. SignalR.Redis如何在引擎盖下工作?
- 3. CSS如何在引擎盖下工作?
- 4. Mockito.when如何在引擎盖下工作
- 5. callvirt如何在引擎盖下工作?
- 6. gmail如何在引擎盖下工作
- 7. Gperftools如何在引擎盖下工作?
- 8. 引擎盖下的OpenFileDialog
- 9. XNA在引擎盖下?
- 10. 引擎盖下的继承
- 11. 引擎盖下的原型范围bean的弹出实例化
- 12. Spring如何保持单件,原型......在引擎盖下?
- 13. File.Move原子操作
- 14. 非原子操作
- 15. DerbyJS原子操作
- 16. 原子操作 - C
- 17. 原子操作和原子交易
- 18. 什么是引擎盖下铸造
- 19. 引擎盖下的Grails list()方法
- 20. PHP flock() - 引擎盖下有什么?
- 21. 引擎盖下如何递归处理
- 22. 引擎盖下的ASP.NET控件
- 23. readline函数:引擎盖下,python
- 24. activeadmin覆盖索引操作
- 25. 覆盖索引操作
- 26. 什么操作都是原子操作
- 27. Netty setRadable()引擎盖
- 28. 操作工作流引擎Java API
- 29. Redis中的原子操作
- 30. x86 128位原子操作
什么编程语言?什么平台?哪个原子操作?什么级别的原子性(文件系统,网络,数据库......)? –
@Matt Ball:这很重要吗? (更新了问题) – Pindatjuh