PowerPC上的原子是使用lwarx(加载字和保留索引)和stwcx.(存储字条件索引)指令实现的.
前者lwarx执行加载并在用于加载的高速缓存行上获取"预留".如果另一个处理器获取该高速缓存行,则此预留将丢失 - 通常是由另一个处理器执行到同一内存地址的存储,或者甚至是同一高速缓存行中的另一个地址(稍后将详细介绍).
该stwcx.指令执行存储,但仅当预留(我们之前获得的lwarx)仍然有效时.更新条件寄存器以指示商店是否成功.
使用这些,我们可以lock xadd通过获取您要更新的位置的预订来实现.使用以下定义lock xadd:
Temporary = Source + Destination;
Source = Destination;
Destination = Temporary;
Run Code Online (Sandbox Code Playgroud)
使用:
像这样的东西可能会起作用:
retry:
# load the word addressed in r1 into r3, and create
# a reservation for that address
lwarx r3, r0, r1
# r4 = r3 + r2
add r4, r3, r2
# if we still have the reservation, store r4 into the address
# in r1...
stwcx. r4, r0, r1
# ... otherwise, try again
bne- retry
Run Code Online (Sandbox Code Playgroud)
但是,这是一个相当简单的情况 - 在为任何架构实现原子时还有其他事项要考虑.例如:
lbarx,lharx和ldarx说明及其st*cx对.出于这个(和其他)原因,通常使用系统提供的原子库而不是编写自己的原子库会更好.例如,gcc提供__sync_add_and_fetch,可能适合您的情况.
如果您需要了解更多信息,请参阅第4.4.2节中的Power ISA第二册.