無鎖編程:在多線程環境下不使用鎖,避免線程阻塞,實現多變量同步,規避競態與死鎖。
CAS 是原子操作,比較內存值與預期值,相等則更新為新值。偽代碼:
int compare_and_swap(int* reg, int oldval, int newval) {
ATOMIC();
int old_reg_val = *reg;
if (old_reg_val == oldval) *reg = newval;
END_ATOMIC();
return old_reg_val;
}
實際使用 GCC 內建:__sync_bool_compare_and_swap、__sync_val_compare_and_swap。典型用法:
while (true) {
int oldval = val;
if (__sync_bool_compare_and_swap(&val, oldval, newval)) break;
}
線程 P1 讀取值 A,被搶佔。P2 將值改為 B 再改回 A。P1 恢復執行 CAS 時發現值仍為 A,誤以為未被修改,導致邏輯錯誤。
引入版本戳或標記位(tag/stamp),如 AtomicStampedReference,標記變量是否被修改過。