原子操作分析

2021-07-23 17:45:00 字數 1049 閱讀 6981

/*

* 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...