如何以原子方式读取x86 ASM中的值?

Iam*_*mIC 6 x86 assembly atomic thread-safety

我知道如何在x86 ASM中自动写入一个值.但我怎么读一个?LOCK前缀不能与mov一起使用.

为了增加价值,我正在做:

lock inc dword ptr Counter
Run Code Online (Sandbox Code Playgroud)

如何以线程安全的方式读取Counter?

GJ.*_*GJ. 5

正如我在这篇文章中向你解释的那样:

通过英特尔酷睿2双核处理器,英特尔酷睿双核处理器,奔腾M,奔腾4,英特尔至强,P6系列,奔腾和英特尔486,无法保证对可缓存的内存进行访问,这些内存分布在总线宽度,缓存行和页面边界上处理器.Intel Core 2 Duo,Intel Core Duo,Pentium M,Pentium 4,Intel Xeon和P6系列处理器提供总线控制信号,允许外部存储器子系统将分离访问原子化; 但是,非对齐数据访问会严重影响处理器的性能,应该避免.

所以使用:

LOCK        CMPXCHG   EAX, [J]
Run Code Online (Sandbox Code Playgroud)

LOCK CMPXCHG第一个fence高速缓存并且比EAX与目标值相比,如果目标值不等于那么EAX中的结果是目标值.

编辑:链接到:

英特尔®64和IA-32架构软件开发人员手册

第3A卷:系统编程指南中,请参阅第8.1.1节

另请参阅:优化参考手册章节:第7章优化高速缓存使用


Mik*_*ron 4

我不是汇编专家,但字大小(在 x86、32 位上)读/写应该已经是原子的了。

您需要锁定增量的原因是因为这既是读取又是写入。

  • 不总是!如果内存地址位于使用多 CPU 单元中的第二个 CPU 的高速缓存中,则不能保证读取是原子的。因此,请使用“LOCK CMPXCHG EAX, [var]”,其中第一个栅栏内存缓存。 (4认同)
  • @GJ:我认为这只适用于未对齐的数据 - 通常你不会有未对齐的数据,所以这不应该是一个问题? (2认同)