跳至內容

Fetch-and-add

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

fetch-and-add是 CPU 指令(FAA), 對內存位置執行增加一个數量的原子操作。具體內容為:


令 x 變做是 _ x _ + _ a _,其中 x 是一个內存位,a 是一个值

FAA 通用佇實現互斥鎖、信號量。

一九九一年,Maurice Herlihy 證明 fetch-and-add 具有一个有限的 consensus 數,會當解決無超過兩个並發進程的無等待 consensus 問題。

用途

下述偽代碼用 ticket lock 算法實現互斥鎖:

` ` ` recordlocktype { _ int _ ticketnumber _ int _ turn } procedureLockInit ( _ locktype _ * lock ) { lock . ticketnumber  :=零 lock . turn  :=零 } procedureLock ( _ locktype _ * lock ) { _ int _ myturn  :=FetchAndIncrement ( & lock . ticketnumber ) / / must be atomic , since many threads might ask for a lock at the same time whilelock . turn ≠ myturn skip/ / _ spin until lock is acquired _ } procedureUnLock ( _ locktype _ * lock ) { FetchAndIncrement ( & lock . turn ) / / this need not be atomic , since only the possessor of the lock will execute this } ` ` `

硬體軟體支持

C + + 十一標準定義矣原子的 fetch \ _ add 函數。GCC 共伊做對 C 語言的擴展。

x 八十六實現

對八千空八十六起,以內存為目的操作數的 ADD 指令就是講 fetch-and-add。若使用 LOCK 前綴,按呢伊對較濟處理器是原子操作。但是袂使倒轉來原值,一直到四百八十六引入 XADD 指令。

後述 GCC 編譯的 C 語言函數,佇咧 x 八十六的三十二位佮六十四位平台頂,使用擴展 asm 語法:

參見

  • Test-and-set
  • Test and Test-and-set
  • Compare-and-swap
  • Load-Link / Store-Conditional

參考文獻