问题标签 [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.

0 投票
1 回答
678 浏览

ms-access - MS Access 原子事务

有什么方法可以使多个用户之间的微软访问事务原子化?

我发现似乎暗示它们不是,但我想知道访问中的原子性是否是特定于驱动程序的。

0 投票
7 回答
37881 浏览

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 上以类似的方式不可用。

0 投票
6 回答
5210 浏览

c# - 在 C# 中对属性的读写是原子的吗?

读取和写入 C# 中的某些基本类型,例如boolint是原子的。

(请参阅 C# 语言规范中的第 5.5 节,“5.5 变量引用的原子性”。)

但是通过属性访问这些变量呢?假设它们也将是原子的和线程安全的是否合理?例如,阅读MyProperty以下原子和线程安全吗?:

那么自动实现的属性呢?

0 投票
4 回答
37518 浏览

unix - 文件附加在 UNIX 中是原子的吗?

一般来说,当我们从多个进程附加到 UNIX 中的一个文件时,我们可以认为什么是理所当然的?是否有可能丢失数据(一个进程覆盖另一个进程的更改)?数据有可能被破坏吗?(例如,每个进程在每次追加到日志文件时追加一行,是否有可能两行被破坏?)如果追加在上述意义上不是原子的,那么确保互斥的最佳方法是什么?

0 投票
3 回答
2183 浏览

python - Django,如何使视图原子化?

我有一个简单的 django 应用程序来模拟股票市场,用户进来买/卖。当他们选择交易时,

  1. 读取市场价格,并且
  2. 根据买/卖订单,市场价格增加/减少。

我不确定这在 django 中是如何工作的,但是有没有办法使视图原子化?即,我担心用户 A 的操作可能会读取价格,但在由于他的订单而更新之前,用户 B 的操作会读取价格。

在网上找不到一个简单、干净的解决方案。谢谢。

0 投票
1 回答
5582 浏览

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。

0 投票
2 回答
626 浏览

iphone - 什么是原子存储类型?

我已经阅读了 Apple 网站上的核心数据参考资料。但我想知道,它们对原子存储类型意味着什么?他们写了一些“必须完整地阅读和写作”的东西。

有人可以澄清一下吗?

0 投票
4 回答
9617 浏览

c# - 为什么接受 Doubles 作为参数的 Interlocked.Add 没有重载?

我完全欣赏 Threading.Interlocked 类提供的原子性;不过,我不明白为什么 Add 函数只提供两个重载:一个用于 Integer,另一个用于 Long。为什么不使用 Doubles 或任何其他数字类型?

显然,更改 Double 的预期方法是 CompareExchange;我猜这是因为修改 Double 是比修改 Integer 更复杂的操作。我仍然不清楚为什么,如果 CompareExchange 和 Add 都可以接受 Integers,那么它们也不能同时接受 Doubles。

0 投票
4 回答
6192 浏览

winapi - 原子 x86 指令与 MS 的 InterlockedCompareExchange 文档的对齐要求?

Microsoft 提供了InterlockedCompareExchange执行原子比较和交换操作的功能。还有一个内在的。_InterlockedCompareExchange

在 x86 上,这些是使用lock cmpxchg指令实现的。

但是,通过阅读有关这三种方法的文档,他们似乎并没有就对齐要求达成一致。

英特尔的参考手册没有提到对齐(除了如果启用对齐检查并进行未对齐的内存引用,则会生成异常)

我还查找了lock前缀,其中明确指出

LOCK 前缀的完整性不受内存字段对齐的影响。

(强调我的)

所以英特尔似乎说对齐是无关紧要的。无论如何,操作都是原子的。

_InterlockedCompareExchange内在文档也没有说明对齐,但是该InterlockedCompareExchange 函数指出

此函数的参数必须在 32 位边界上对齐;否则,该函数将在多处理器 x86 系统和任何非 x86 系统上运行不可预测。

那么给了什么?对齐要求是否InterlockedCompareExchange只是为了确保该功能即使在cmpxchg指令不可用的 486 之前的 CPU 上也能正常工作?根据上述信息,这似乎很可能,但在我依赖它之前我想确定一下。:)

或者ISA是否需要对齐来保证原子性,而我只是在英特尔的参考手册中寻找错误的地方?

0 投票
8 回答
482 浏览

c - 关于C中的原子性保证

在 x86 机器上,像 inc、addl 这样的指令不是原子的,并且在 SMP 环境下,在没有锁定前缀的情况下使用它们是不安全的。但是在UP环境下是安全的,因为inc、addl等简单的指令不会被打断。

我的问题是,给定一个 C 级语句,例如

是否有任何保证 C 编译器将始终使用 UP 安全指令,例如

但不是那些线程不安全的指令(比如在可能被上下文切换中断的几条指令中实现 C 语句)即使在 UP 环境中?