假設我有兩個執行緒在全域范圍內從靜態 int 變數隨機遞增或遞減。我的程式不關心這個變數的確切值,只關心它是隨時間增加還是減少。
雖然我在大學期間寫過一些匯編代碼,但我并不熟悉 CPU 如何處理多執行緒和內核之間的通信。兩個同時寫入是否有可能破壞每個位元組級別的全域變數?還是對記憶體的讀寫(例如移動、加載、存盤)總是原子的?
我使用 Visual Studio 2022 和 C 17,并希望針對所有現代桌面 CPU(英特爾、AMD)。
uj5u.com熱心網友回復:
CPU是這里最少的問題。C 宣告這些互動中的任何一個都代表未定義的行為。因此,請考慮以下代碼:
int i; //Global variable.
void some_func()
{
i = 5;
if(i > 5)
{
//A
}
}
編譯器可以看到分配i和檢查其值之間的所有代碼。可以看出這兩個操作之間沒有執行緒間同步。因為 C 標準規定i在這些情況下從另一個執行緒進行的任何修改都是未定義的行為,所以編譯器可以自由地假設此類修改不會發生。
因此,編譯器知道i此時永遠不會大于 5,因此可能會洗掉塊“A”和條件測驗,甚至不會發出可以執行的程式集。
這就是“未定義的行為”的意思。
如果您想玩這樣的事情,如果您想在這種情況下實際使用 CPU/快取/等的行為,您將需要使用較低級別的語言進行操作。就其價值而言,C 標準的措辭或多或少是相同的,所以 C 不是。
只要您使用 C 或 C 作業,您所問的問題基本上是無法回答的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461345.html
