[Go] Concurrency: Atomic
Go๋ ์ฌํ ์ธ์ด๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Atomic ํ์
๋ค์ ๋๊ธฐํ ์๋จ์ผ๋ก์ ์ ๊ณตํ๋ค.
๋ด์ฅ ๋ชจ๋ "sync/atomic"์ ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ด ๋ค์ด์๋ค.
Go์ Atomic
์ผ๋จ ๋ค์ด๊ฐ๊ธฐ์ ์์์, Go๋ Atomic์ ์ง์ ํธ๋ค๋งํ๋๊ฑธ ๊ถ์ฅํ์ง ์๋ ์
์ฅ์ ์ทจํ๊ณ ์๋ค.
๊ฐ๊ธ์ ์ฑ๋์ด๋ Mutex ๊ฐ์ ์๋จ์ผ๋ก ํด๊ฒฐํ๋ผ๋ ๊ฒ์ด๋ค.
Go๋ atomic ์ต์ ํ์ ์ค์ํ memory ordering ๊ฐ๋
์ ์ ๊ณตํ์ง ์๋๋ค. C/C++, Rust ๊ฐ์ด low-level ์ ์ด๋ฅผ ์งํฅํ๋ ์ธ์ด๋ค๊ณผ ๋ค๋ฅด๋ค.
๊ทธ๋์ Go์ atomic์ ๊ฐ์ฅ ๋๋ฆฐ ordering์ธ SeqCst ๋จ์๋ก๋ง ๋์ํ๋ค. ๋ถ์์ฉ ์์ด ์์ ํ ๋์ ๋๋ฆฐ ๊ฒ์ด๋ค. ์ด๋ฐ๊ฒ ๋ง์ ์๋ ๋ค๋ฉด Rust๋ฅผ ์ฐ๋ฉด ๋๋ค.
๊ด๋ จ ํฌ์คํธ
https://blog.naver.com/sssang97/223356930725
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
Atomic wrapper ํ์ ์ผ๋ก๋ ์ด 6๊ฐ์ ํ์ ์ ์ ๊ณตํ๋ค.

Pointer๋ง ์ ๋๋ฆญ์ด๋ค.
ํน์ ๊ทธ๋ฅ ์ ์ญํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ์ทจํฅ์ ๋ฐ๋ผ์ ๊ณ ๋ฅด๋ฉด ๋๋๋ฐ, ๋๋ Wrapper ํ์ ์ ๊ถ์ฅํ๋ค.
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ํํ๋ Load๋ก ๊ฐ์ ๊ฐ์ ธ์ค๊ณ Store๋ก ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
์ด 2๊ฐ์ง ์ฐ์ฐ์ thread safeํ๊ฒ ๋์ํ๋ค. data race๊ฐ ์๋ค๋ ๊ฒ์ด ๋ณด์ฅ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด race๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋๊ฐ ์๋ค๋ฉด

๋ค์๊ณผ ๊ฐ์ด atomic์ ์ ์ฉํด์ ๊ฐ์ ํ ์ ์๋ค.
race ์์ด ์ ๋์ํ๋ค.
Compare And Swap
Compare And Swap์ ์กฐ๊ฑด์ ๊ธฐ๋ฐํ atomic mutation์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ฝ๊ฐ ๋๊ด์ ์ธ lock ๊ฐ์๊ฑธ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๊ธฐ์ ์ฉ์ดํ๋ค.
๊ด๋ จ ํฌ์คํธ ์ฐธ์กฐ
https://blog.naver.com/sssang97/222721792446
์ฌ์ฉ๋ฒ์ ๋์ถฉ ์ด๋ ๋ค.
์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์๋ ๊ธฐ์กด ๊ฐ old์, ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์๋ ์ ๊ฐ new๋ฅผ ๋ฃ๋๋ค.
๋์ ๋ฐฉ์์ ์ด๋ ๋ค.
- ํ์ฌ ์ ์ฅ๋ ๊ฐ์ด ๊ธฐ์กด old์ ๊ฐ๋ค๋ฉด ์ ์ฅ๋ ๊ฐ์ new๋ก ๊ต์ฒดํ๋ค. ์ด ๊ฒฝ์ฐ true๋ฅผ ๋ฆฌํดํ๋ค.
- old์ ๊ฐ์ง ์๋ค๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ false๋ฅผ ๋ฆฌํดํ๋ค.
์ด ์์ ์ ํญ์ ์์์ ์ผ๋ก ์ํ๋๋ค.
Cash buffer๋ก ์ธํ ์์ ๊ผฌ์ ๋ฌธ์
go์ ๋ชจ๋ atomic ์ฐ์ฐ์ SeqCst๋ผ์ ์ด์ง๊ฐํ ์ฐ์ฐ ์์๋ ๋ณด์ฅ๋๋ค.
๊ทผ๋ฐ ๊ทธ๊ฒ ๋ชจ๋ ์ํฉ์์ ๋ณด์ฅ๋๋๊ฑด ์๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์๋
๋
ผ๋ฆฌ์ ์ผ๋ก ๋ณด๋ฉด number1์ 10์ผ๋ก ์์ ํ ๋ค์ number2๋ฅผ 20์ผ๋ก ์์ ํ๊ธฐ ๋๋ฌธ์, ์ ์๊ฐ 0์ด๋ฉด์ ํ์๊ฐ 20์ธ ์ํฉ์ด ์ฐ์ถ๋ ์๊ฐ ์๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ ๋ฐ์์ด ๊ฐ๋ฅํ๋ค.
๊ฐ ์ค๋ ๋ ์์ญ ๋ด์์์ ์ฐ๊ธฐ ๋์์ ์์ฐจ์ฑ์ ๋ณด์ฅํ์ง๋ง, ์ค๋ ๋ ๊ฐ ์บ์ ์ ํ์ ์์ด์๋ ์์๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๊ฑด ๋ชจ๋ ์ธ์ด๊ฐ ๋ค ๊ทธ๋ ๋ค.
์ด๋ฐ๊ฒ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๋ฉด ๊ทธ๋ฅ ์ฑ๋์ด๋ mutex ๊ฐ์ ๋น๊ด์ ๋ฝ์ ๊ฑธ์ด์ผ ํ๋ค.
์ฐธ์กฐ
https://pkg.go.dev/sync/atomic
https://stackoverflow.com/questions/28924132/go-atomic-and-memory-order
https://go101.org/article/concurrent-atomic-operation.html