** Linux提供的兩個原子操作接口:**
原子整數操作:
針對整數的原子操作只能對atomic_t類型的數據處理。這里沒有使用C語言的int類型,主要是因為:
讓原子函數只接受atomic_t類型操作數,可以確保原子操作只與這種特殊類型數據一起使用。
使用atomic_t類型確保編譯器不對相應的值進行訪問優化。 (原理為: 變量被volatile修飾了)
使用atomic_t類型可以屏蔽不同體系結構上的數據類型的差異。盡管Linux支持的所有機器上的整型數據都是32位,但是使用atomic_t的代碼只能將該類型的數據當作24位來使用。這個限制完全是因為在SPARC體系結構上,原子操作的實現不同于其它體系結構:32位int類型的低8位嵌入了一個鎖,因為SPARC體系結構對原子操作缺乏指令級的支持,所以只能利用該鎖來避免對原子類型數據的并發訪問。
原子整數操作最常見的用途就是實現計數器。原子整數操作列表在中定義。原子操作通常是內斂函數,往往通過內嵌匯編指令來實現。如果某個函數本來就是原子的,那么它往往會被定義成一個宏。
原子位操作:
原子位操作定義在文件中。令人感到奇怪的是位操作函數是對普通的內存地址進行操作的。原子位操作在多數情況下是對一個字節長的內存訪問,因而位號該位于0-31之間(在64位機器上是0-63之間),但是對位號的范圍沒有限制。
操作系統可以確保,在同一時刻,只有一個CPU的一個進程訪問特定的某個字節,再加上單核中的原子性(基本數據類型的簡單操作),所以單字節內存的簡單操作是具有天生的多核原子性的。
回答所涉及的環境:聯想天逸510S、Windows 10。
** Linux提供的兩個原子操作接口:**
原子整數操作:
針對整數的原子操作只能對atomic_t類型的數據處理。這里沒有使用C語言的int類型,主要是因為:
讓原子函數只接受atomic_t類型操作數,可以確保原子操作只與這種特殊類型數據一起使用。
使用atomic_t類型確保編譯器不對相應的值進行訪問優化。 (原理為: 變量被volatile修飾了)
使用atomic_t類型可以屏蔽不同體系結構上的數據類型的差異。盡管Linux支持的所有機器上的整型數據都是32位,但是使用atomic_t的代碼只能將該類型的數據當作24位來使用。這個限制完全是因為在SPARC體系結構上,原子操作的實現不同于其它體系結構:32位int類型的低8位嵌入了一個鎖,因為SPARC體系結構對原子操作缺乏指令級的支持,所以只能利用該鎖來避免對原子類型數據的并發訪問。
原子整數操作最常見的用途就是實現計數器。原子整數操作列表在中定義。原子操作通常是內斂函數,往往通過內嵌匯編指令來實現。如果某個函數本來就是原子的,那么它往往會被定義成一個宏。
原子位操作:
原子位操作定義在文件中。令人感到奇怪的是位操作函數是對普通的內存地址進行操作的。原子位操作在多數情況下是對一個字節長的內存訪問,因而位號該位于0-31之間(在64位機器上是0-63之間),但是對位號的范圍沒有限制。
操作系統可以確保,在同一時刻,只有一個CPU的一個進程訪問特定的某個字節,再加上單核中的原子性(基本數據類型的簡單操作),所以單字節內存的簡單操作是具有天生的多核原子性的。
回答所涉及的環境:聯想天逸510S、Windows 10。