記憶體屏障 --20240310

lethe1203發表於2024-03-10
記憶體屏障(Memory Barrier)是一種硬體或軟體機制,用於協調併發訪問共享資源時的資料一致性。它可以控制處理器和快取對記憶體操作的順序和時序,從而確保共享變數的讀寫操作按照預期方式進行。
在多執行緒或多核處理器系統中,為了避免競態條件(Race Condition)等問題,常常需要使用記憶體屏障來保證資料的一致性。記憶體屏障通常分為以下幾種:
  1. 讀屏障(Read Barrier): 確保所有之前的讀操作已經完成,防止後續的讀操作獲取到髒資料。
  2. 寫屏障(Write Barrier): 確保所有之前的寫操作已經完成,防止後續的寫操作干擾到其他執行緒或程序。
  3. 全屏障(Full Barrier):確保所有之前的讀寫操作已經完成,防止後續的讀寫操作出現異常或衝突。
barrier() 函式通常用於建立一個同步點(barrier),在該同步點處,多個執行緒或程序需要等待其他所有執行緒或程序都完成某個階段的工作後才能繼續執行後續的操作。
在多執行緒程式設計中,barrier() 函式通常與多執行緒同步和併發控制相關。它可以用於確保所有執行緒都完成了一定的任務後再進行下一步操作,從而避免競態條件和資料不一致性問題。
define barrier() \
        __asm__ __volatile__("": : :"memory")
        
barrier_data 是宏的名稱,接受一個指標作為引數。
__asm__ __volatile__ 是內聯彙編的標記,用於告訴編譯器後面的內容是內聯彙編程式碼,並且禁止編譯器對其進行最佳化。
"" 表示內聯彙編沒有任何運算元。
:: 表示沒有輸入和輸出運算元,即這個內聯彙編沒有讀取或寫入任何暫存器或記憶體位置。
:"memory" 是一個記憶體約束,告訴編譯器記憶體會被修改,因此需要在記憶體上重新整理相關操作並防止最佳化。
define example_macro(arg1, arg2) \
    __asm__ __volatile__ ( \
        "add %0, %1, %2" \
        : "=r" (arg1) \
        : "r" (arg2), "r" (3) \
    )

example_macro 是宏的名稱,接受兩個引數 arg1 和 arg2。
__asm__ __volatile__ 是內聯彙編的標記,告訴編譯器接下來的內容是內聯彙編程式碼,並且禁止編譯器對其進行最佳化。
"add %0, %1, %2" 是實際的彙編指令,將暫存器 %1 和立即數 3 相加,結果儲存在暫存器 %0 中。
: "=r" (arg1) 表示輸出運算元,使用暫存器(r)來儲存 arg1 的值,並將其約束為輸出。
: "r" (arg2), "r" (3) 表示輸入運算元,使用暫存器(r)來儲存 arg2 和立即數 3 的值,並將其約束為輸入。

"=r" (arg1) 表示將計算結果儲存到一個通用暫存器中,並將其約束為輸出。這裡的 "=" 符號表示這是一個輸出運算元,而 "r" 則表示將結果儲存到一個通用暫存器中。

相關文章