[Rust] Atomic
๋ฌ์คํธ๋ C++์ฒ๋ผ ์์์ ์ฐ์ฐ ํ์
์ ์ ๊ณตํ๋ค.
๋์๋ฐฉ์๋ C++์ ๊ฑฐ์ ๋์ผํ๋ค๊ณ ํ๋ค.
์์์ ์ฐ์ฐํ์ , ์งง๊ฒ ๋งํด ์ํ ๋ฏน์ ๊ธฐ๋ณธ ํ์ ๋จ์์์ ์์ ํ ์ค๋ ๋์์ ์ฑ์ ์ ๊ณตํ๋ ํน์ํ ํ์ ์ด๋ค.
๊ธฐ์กด์ ์ค๋ ๋ ๋๊ธฐํ ๋ฐฉ๋ฒ์ mutex ๋ฑ์ผ๋ก ์ ๊ทผ์์ ๋ฝ์ ๊ฑธ์ด์ ๋ก์ง๋ฒ์์์ ๋ธ๋ญ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์, ๋ถํ๊ฐ ์ ์ง ์์ ํธ์ธ๋ฐ.
์ํ ๋ฏน์ ์ข๋ ์ข์ ๋จ์์์ ์ด๊ฑธ ์ํํ๊ณ ์ต์ ํ๊ฐ ์ ๋๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋น ๋ฅด๋ค.
๋ค๋ง, ์ํ ๋ฏน์ ํน์ ๊ธฐ๋ณธํ์
์ ๋ํด์๋ง ์ ์๊ฐ ๋์ด์๋ค. ๋จ์ํ ์ ์๊ณ์ดํ์
๋ค๋ง ๋ง์ด๋ค.
๊ทธ ๋ชฉ๋ก์ ์๋์ ๊ฐ๋ค.


๊ทธ๋ฆฌ๊ณ Ordering์ด๋๊ฒ ์๋๋ฐ, ์ํ ๋ฏน ์ฐ์ฐ ์ต์ ํ๋ฅผ ์ด๋ป๊ฒ ํ ์ง ์ง์ ํ๋ ๋ถ๋ถ์ด๋ค.

์ด๊ฑธ ์ฐ์ฐํ ๋๋ง๋ค ์ ๋นํ ์ ๋ฃ์ด์ค์ผํ๋ค.
๊ฐ๋จํ ์ค๋ช
ํ์๋ฉด Relaxed๋ ๊ฐ์ฅ ๋์จํ ์ ์ฝ์ด๊ณ , SeqCst๊ฐ ๊ฐ์ฅ ๋นก๋นกํ ์ ์ฝ์ ๊ฐ๊ณ ์์ด์ ๊ฐ์ฅ ๋๋ฆฌ๋ค.
๊ทธ๋ฆฌ๊ณ Acquire์ Release๋ ์์ผ๋ก ๋ฌถ์ธ๋ค.
์ผ๋จ ์ฌ๊ธฐ์๋ SeqCst๋ง ์ฐ๊ณ ํ์ผ์ ์์ธํ ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.
์ผ๋จ Atomicํ์
๋ค์ Mutex์ฒ๋ผ ๋ณดํต Arc๋ก ๊ฐ์ธ์ ์ฌ์ฉํ๋ค.
๋ง์ฝ ์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ ๊ฐ์ ๋ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ํ๋ฉด ๋๋ค.


๋ง์
fetch_add ์ธ์ fetch ์๋ฆฌ์ฆ๋ก๋ ๋ค์ ๊ฒ๋ค์ด ์๋ค.

์ ๋นํ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฐธ์กฐ
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