[Rust] Atomic

๋Ÿฌ์ŠคํŠธ๋„ C++์ฒ˜๋Ÿผ ์›์ž์  ์—ฐ์‚ฐ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค.
๋™์ž‘๋ฐฉ์‹๋„ C++์™€ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

์›์ž์  ์—ฐ์‚ฐํƒ€์ž…, ์งง๊ฒŒ ๋งํ•ด ์•„ํ† ๋ฏน์€ ๊ธฐ๋ณธ ํƒ€์ž… ๋‹จ์œ„์—์„œ ์™„์ „ํ•œ ์Šค๋ ˆ๋“œ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํƒ€์ž…์ด๋‹ค.

๊ธฐ์กด์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์€ mutex ๋“ฑ์œผ๋กœ ์ ‘๊ทผ์‹œ์— ๋ฝ์„ ๊ฑธ์–ด์„œ ๋กœ์ง๋ฒ”์œ„์—์„œ ๋ธ”๋Ÿญ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ€ํ•˜๊ฐ€ ์ ์ง€ ์•Š์€ ํŽธ์ธ๋ฐ.
์•„ํ† ๋ฏน์€ ์ข€๋” ์ข์€ ๋‹จ์œ„์—์„œ ์ด๊ฑธ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ตœ์ ํ™”๊ฐ€ ์ž˜ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

๋‹ค๋งŒ, ์•„ํ† ๋ฏน์€ ํŠน์ • ๊ธฐ๋ณธํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋‹ค. ๋‹จ์ˆœํ•œ ์ •์ˆ˜๊ณ„์—ดํƒ€์ž…๋“ค๋งŒ ๋ง์ด๋‹ค.
๊ทธ ๋ชฉ๋ก์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. image

image

๊ทธ๋ฆฌ๊ณ  Ordering์ด๋ž€๊ฒŒ ์žˆ๋Š”๋ฐ, ์•„ํ† ๋ฏน ์—ฐ์‚ฐ ์ตœ์ ํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. image

image ์ด๊ฑธ ์—ฐ์‚ฐํ• ๋•Œ๋งˆ๋‹ค ์ ๋‹นํžˆ ์ž˜ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค.
๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด Relaxed๋Š” ๊ฐ€์žฅ ๋А์Šจํ•œ ์ œ์•ฝ์ด๊ณ , SeqCst๊ฐ€ ๊ฐ€์žฅ ๋นก๋นกํ•œ ์ œ์•ฝ์„ ๊ฐ–๊ณ  ์žˆ์–ด์„œ ๊ฐ€์žฅ ๋А๋ฆฌ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Acquire์™€ Release๋Š” ์Œ์œผ๋กœ ๋ฌถ์ธ๋‹ค.

์ผ๋‹จ ์—ฌ๊ธฐ์„œ๋Š” SeqCst๋งŒ ์“ฐ๊ณ  ํ›„์ผ์— ์ž์„ธํžˆ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

์ผ๋‹จ Atomicํƒ€์ž…๋“ค์€ Mutex์ฒ˜๋Ÿผ ๋ณดํ†ต Arc๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•œ๋‹ค.
๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ๊ฐ’์„ ๋”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค. image

image

image ๋ง์…ˆ fetch_add ์™ธ์— fetch ์‹œ๋ฆฌ์ฆˆ๋กœ๋Š” ๋‹ค์Œ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค. image

image ์ ๋‹นํžˆ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.


์ฐธ์กฐ
https://doc.rust-lang.org/nomicon/atomics.html
https://doc.rust-lang.org/std/sync/atomic/
https://stackoverflow.com/questions/30407121/which-stdsyncatomicordering-to-use
https://doc.rust-lang.org/std/sync/atomic/struct.AtomicI32.html