/*
* armv6 up and smp safe atomic ops. we use load exclusive and
* store exclusive to ensure that these are atomic. we may loop
*/static inline void atomic_add(int i, atomic_t *v)
原始碼分析:
注意:根據內聯彙編的語法,result、tmp、&v->counter對應的資料都放在了暫存器中操作。如果出現上下文切換,切換機制會做暫存器上下文保護。
(1)ldrex %0, [%3]
意思是將&v->counter指向的資料放入result中,並且(分別在local monitor和global monitor中)設定獨佔標誌。
(2)
add %0, %0, %4
result = result + i
(3)
strex %1, %0, [%3]
意思是將result儲存到&v->counter指向的記憶體中,此時
exclusive monitors會發揮作用,將儲存是否成功的標誌放入tmp中。
(4)
teq %1, #0
測試strex是否成功(tmp == 0 ??)
(5)
bne 1b
如果發現strex失敗,從(1)再次執行。
通過上面的分析,可知關鍵在於strex的操作是否成功的判斷上。而這個就歸功於arm的exclusive monitors和ldrex/strex指令的機制。以下通過可能的情況分析ldrex/strex指令機制。(請閱讀時參考4.2.12. ldrex
和strex
)**linux核心arm構架中原子變數的底層實現研究
原子操作原理分析
原子操作是指不被打斷的操作,即它是最小的執行單位。最簡單的原子操作就是一條條的彙編指令 不包括一些偽指令,偽指令會被彙編器解釋成多條彙編指令 在 linux 中原子操作對應的資料結構為 atomic t,定義如下 typedef struct atomic t 本質上就是乙個整型變數,之所以定義這麼...
原子性,原子操作
舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...
原子變數與原子操作
1.原子操作的速度要快於臨界區,event,互斥量,如果多個執行緒同時寫乙個變數時,最方便的就是原子操作。原子操作函式,解決多執行緒安全 2.原子變數也是為了解決執行緒衝突問題,如果兩個執行緒同時訪問同乙個變數,乙個執行緒改變了這個變數,另乙個執行緒就會出現一些bug。3.release和debug...