问题标签 [atomic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ms-access - MS Access 原子事务
有什么方法可以使多个用户之间的微软访问事务原子化?
我发现这似乎暗示它们不是,但我想知道访问中的原子性是否是特定于驱动程序的。
c - UNIX 可移植原子操作
C 中是否有一种(POSIX-)可移植方式用于原子变量操作,类似于使用 pthread 的可移植线程?
原子操作是诸如“递增和获取”之类的操作,它们以原子方式执行,这意味着没有上下文切换可以干扰操作。在 Linux 内核空间中,我们有atomic_t类型,在 Java 中我们有java.util.concurrent.atomic包。
在 Linux 上,atomic.h 文件提供原子操作,但包含依赖于平台,例如#include <asm-x86_64/atomic.h>
,它在 Mac OS X 上以类似的方式不可用。
c# - 在 C# 中对属性的读写是原子的吗?
读取和写入 C# 中的某些基本类型,例如bool
和int
是原子的。
(请参阅 C# 语言规范中的第 5.5 节,“5.5 变量引用的原子性”。)
但是通过属性访问这些变量呢?假设它们也将是原子的和线程安全的是否合理?例如,阅读MyProperty
以下原子和线程安全吗?:
那么自动实现的属性呢?
unix - 文件附加在 UNIX 中是原子的吗?
一般来说,当我们从多个进程附加到 UNIX 中的一个文件时,我们可以认为什么是理所当然的?是否有可能丢失数据(一个进程覆盖另一个进程的更改)?数据有可能被破坏吗?(例如,每个进程在每次追加到日志文件时追加一行,是否有可能两行被破坏?)如果追加在上述意义上不是原子的,那么确保互斥的最佳方法是什么?
python - Django,如何使视图原子化?
我有一个简单的 django 应用程序来模拟股票市场,用户进来买/卖。当他们选择交易时,
- 读取市场价格,并且
- 根据买/卖订单,市场价格增加/减少。
我不确定这在 django 中是如何工作的,但是有没有办法使视图原子化?即,我担心用户 A 的操作可能会读取价格,但在由于他的订单而更新之前,用户 B 的操作会读取价格。
在网上找不到一个简单、干净的解决方案。谢谢。
git - 为什么 git 允许远程标签移动,或者为什么你不能使用 git-tag 进行原子测试和设置
我有一个问题,两个类似的进程在同一存储库的不同克隆中并行运行(通常在不同的计算机上)。每次进程运行时,它都会从远程获取最新的标签,然后根据它看到的标签推断出一个唯一的数字。
例如,如果遥控器上存在这些标签:1.0 1.1 1.2 1.3,那么进程将选择 1.4 作为下一个数字。
在该过程开始之前,它会创建一个新标签并将其推送回远程:
这个想法是,这是一种原子选择数字的方法。另一个进程,如果它同时查看,可能也决定使用 1.4,但是当它推送它的标签时,它应该发现 1.4 已经存在,并选择 1.5 代替(然后再试一次)。
我希望我可以将 git 标签推送视为原子的。
不幸的是,由于某些奇怪的原因,git 允许远程标签在某些情况下移动!
例如,假设标签 1.4 已放在 origin/master 上并推送。另一个进程想要将标签 1.4 放在例如 origin/master^ 上,这将涉及向后移动标签。Git 会以“非快进”错误拒绝此操作:
过程一:
过程乙:
好的,没关系,进程B可以用这个来试试1.5。
但是考虑一下这种情况:
过程一:
过程乙:
哦。真可惜——git 没有表明这个标签已经存在于遥控器上。实际上,使用 -v 确实如此:
好的,所以我可以进行某种标准错误重定向,搜索“=”,这将允许进程 B 确定 1.4 已经在使用中。
但这有点傻。情况变得更糟:
过程一:
过程乙:
阿格!什么?Git刚刚移动了远程标签而没有警告!
所以在我看来,git 中的远程标签从根本上被破坏了——它们不应该在没有明确请求的情况下“移动”。更重要的是,他们应该默认拒绝移动。
此外, git-tag 命令应该提供一种自动测试和设置标签的方法。
但显然不是。首先运行 git fetch 并没有帮助,因为仍然存在冲突窗口,即使存在冲突,在三种情况之一中,标签只会移动!
这里发生了什么?
还有另一种测试和设置标签的方法吗?
如果没有,人们如何在自动构建环境中分配和保留构建号?您如何可靠地检测两个进程何时无意中获取了相同的内部版本号?
使用 git 1.6.1.2。
iphone - 什么是原子存储类型?
我已经阅读了 Apple 网站上的核心数据参考资料。但我想知道,它们对原子存储类型意味着什么?他们写了一些“必须完整地阅读和写作”的东西。
有人可以澄清一下吗?
c# - 为什么接受 Doubles 作为参数的 Interlocked.Add 没有重载?
我完全欣赏 Threading.Interlocked 类提供的原子性;不过,我不明白为什么 Add 函数只提供两个重载:一个用于 Integer,另一个用于 Long。为什么不使用 Doubles 或任何其他数字类型?
显然,更改 Double 的预期方法是 CompareExchange;我猜这是因为修改 Double 是比修改 Integer 更复杂的操作。我仍然不清楚为什么,如果 CompareExchange 和 Add 都可以接受 Integers,那么它们也不能同时接受 Doubles。
winapi - 原子 x86 指令与 MS 的 InterlockedCompareExchange 文档的对齐要求?
Microsoft 提供了InterlockedCompareExchange
执行原子比较和交换操作的功能。还有一个内在的。_InterlockedCompareExchange
在 x86 上,这些是使用lock cmpxchg
指令实现的。
但是,通过阅读有关这三种方法的文档,他们似乎并没有就对齐要求达成一致。
英特尔的参考手册没有提到对齐(除了如果启用对齐检查并进行未对齐的内存引用,则会生成异常)
我还查找了lock
前缀,其中明确指出
LOCK 前缀的完整性不受内存字段对齐的影响。
(强调我的)
所以英特尔似乎说对齐是无关紧要的。无论如何,操作都是原子的。
_InterlockedCompareExchange
内在文档也没有说明对齐,但是该InterlockedCompareExchange
函数指出
此函数的参数必须在 32 位边界上对齐;否则,该函数将在多处理器 x86 系统和任何非 x86 系统上运行不可预测。
那么给了什么?对齐要求是否InterlockedCompareExchange
只是为了确保该功能即使在cmpxchg
指令不可用的 486 之前的 CPU 上也能正常工作?根据上述信息,这似乎很可能,但在我依赖它之前我想确定一下。:)
或者ISA是否需要对齐来保证原子性,而我只是在英特尔的参考手册中寻找错误的地方?
c - 关于C中的原子性保证
在 x86 机器上,像 inc、addl 这样的指令不是原子的,并且在 SMP 环境下,在没有锁定前缀的情况下使用它们是不安全的。但是在UP环境下是安全的,因为inc、addl等简单的指令不会被打断。
我的问题是,给定一个 C 级语句,例如
是否有任何保证 C 编译器将始终使用 UP 安全指令,例如
但不是那些线程不安全的指令(比如在可能被上下文切换中断的几条指令中实现 C 语句)即使在 UP 环境中?