[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๋ฅผ ๋„ฃ๋Š”๋‹ค.

๋™์ž‘ ๋ฐฉ์‹์€ ์ด๋ ‡๋‹ค.

  1. ํ˜„์žฌ ์ €์žฅ๋œ ๊ฐ’์ด ๊ธฐ์กด old์™€ ๊ฐ™๋‹ค๋ฉด ์ €์žฅ๋œ ๊ฐ’์„ new๋กœ ๊ต์ฒดํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ true๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
  2. 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