多核心與同步
在上方的程式碼中,執行緒1準備好data後以flag通知,執行緒2看到flag後讀取data。在弱記憶體一致性模型的CPU上,要讓執行緒2確實讀到42,下列何者是必要的做法?
// 執行緒1 // 執行緒2
data = 42; while (flag == 0) { }
flag = 1; print(data);
- A把data的型別從int改為long
- B將對flag的寫入設為釋放(release)、對flag的讀取設為取得(acquire),以保證順序
- C不要在執行緒2的迴圈中寫任何東西
查看答案與解析
正確答案:B. 將對flag的寫入設為釋放(release)、對flag的讀取設為取得(acquire),以保證順序
在弱模型中,執行緒1的兩個寫入可能看起來被調換,執行緒2對data的讀取也可能比對flag的讀取更早進行,因此可能發生flag已是1而data仍是舊值的情形。若將對flag的寫入設為釋放,就能保證在它之前的寫入會先被看到;若將對flag的讀取設為取得,則在它之後的讀取不會搶先進行。
- A. 即使改變型別,也無法保證順序。
- B. 正確。保證data的寫入比flag先被看到。
- C. 迴圈的內容與順序的保證無關。