[Concurrency] Fetch And Add (FAA)

Fetch And AddλŠ” Compare And Swapκ³Ό λΉ„μŠ·ν•œ μΈμŠ€νŠΈλŸ­μ…˜ μˆ˜μ€€μ˜ lock-freeν•œ atomic μ—°μ‚° 기법이닀.
κ·Έλƒ₯도 μ‚¬μš©ν•  수 있고, μŠ€ν•€λ½ 등을 κ΅¬ν˜„ν•˜λŠ”λ° μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

λ§€μ»€λ‹ˆμ¦˜μ„ C μ½”λ“œλ‘œ λ‚˜νƒ€λ‚΄λ©΄ μ΄λ ‡κ²Œ λœλ‹€.

int fetch_and_add(int* object, int add) {
    int old = *object;
    *object += add;
    return old;
}

값을 λ”ν•˜κ³ , λ”ν•˜κΈ° μ΄μ „μ˜ 값을 λ°˜ν™˜ν•œλ‹€.

Compare And Swap이 비ꡐ-ν›„ μˆ˜μ •ν•˜λŠ” κ²ƒμœΌλ‘œ μ‹€νŒ¨ κ°€λŠ₯ν•œ μ—°μ‚°μ΄μ—ˆλ‹€λ©΄, Fetch And AddλŠ” μš°μ„  λ”ν•˜κ³  λ³΄λŠ” μ’€ λ¬΄μ‹ν•œ λ™μž‘μ„ κ°€μ§„λ‹€.
상황에 맞게 잘 μ‚¬μš©ν•˜λ©΄ λœλ‹€.




μ–΄μ…ˆλΈ”λ¦¬μ—μ„œ

x86의 경우, lockκ³Ό xadd 같은 λͺ…령을 μ‘°ν•©ν•˜λŠ” κ²ƒμœΌλ‘œ FAA 연산을 κ΅¬ν˜„ν•  수 μžˆλ‹€.
이런 ν˜•νƒœλ‹€.




κ³ κΈ‰ μ–Έμ–΄μ—μ„œ (Rust)

Rust의 경우, Atomic νƒ€μž…μ˜ κΈ°λ³Έ μ—°μ‚° ν•¨μˆ˜λ‘œμ„œ 제곡이 λœλ‹€.

λ§μ…ˆ 말고도 ν•„μˆ˜μ μΈ μ—°μ‚° ν•¨μˆ˜λ“€μ€ λ‹€ λ“€μ–΄μžˆλ‹€.

μ•„λž˜ μ½”λ“œλŠ” FAAλ₯Ό μ΄μš©ν•΄μ„œ 6개의 μŠ€λ ˆλ“œμ—μ„œ 각각 100000번 1만큼 μ¦κ°€μ‹œν‚€λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.

잘 λˆλ‹€.



μ°Έμ‘°
https://en.wikipedia.org/wiki/Fetch-and-add