ARM 和x86-64:無保證的原子類型
與最初的假設相反,C/C 語言標準不提供任何保證適用於任何特定資料類型的原子操作,即使是64位元
透過訊號與執行緒進行原子存取
區分原子性的兩個概念至關重要:
GCC在ARM 和x86-64 上的實現
而現代CPU(如ARMv8)而x86-64可能會保證某些操作的原子訪問,這些保證並沒有體現在語言層面。 GCC 和其他編譯器可以以違反這些硬體級原子性的方式優化程式碼,如下例所示:
volatile uint32_t x; uint32_t foo(void) { return (x >> 8) & 0xffff; }
即使x 是32 位元變量,GCC 也會將foo 編譯為兩個單獨的16 位元變數-bit 加載,如果同時修改x,可能會導致非原子讀取。
依賴std::atomic 或_Atomic
確保C 和C 中原子操作的唯一方法是明確使用std::atomic (C ) 或_Atomic (C) 類型,它們提供必要的同步保證執行緒安全存取的機制。
以上是C/C 標準是否保證 ARM 和 x86-64 架構上任何資料類型的原子操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!