首頁 >後端開發 >C++ >C/C 標準是否保證 ARM 和 x86-64 架構上任何資料類型的原子操作?

C/C 標準是否保證 ARM 和 x86-64 架構上任何資料類型的原子操作?

DDD
DDD原創
2024-12-15 14:29:31507瀏覽

Do C/C   Standards Guarantee Atomic Operations for Any Data Type on ARM and x86-64 Architectures?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn