[Concurrency] Lock: ์กฐ๊ฑด ๋ณ์ (Condition Variable)
Condition Variable์ ๋ํ์ ์ธ ๋์์ฑ primitive ๊ตฌํ ์ค ํ๋๋ค.
์ค๋ ๋ ๊ฐ์ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋(wait) ์๋ ค์ ๊นจ์์ฃผ๋(notify) ๋ฑ ๋์ ์ธ ์ํธ์์ฉ์ ์ต์ ํ๋ ๋๊ธฐํ ์๋จ์ด๋ค.
ํนํ ์ค๋ซ๋์ ๊ธฐ๋ค๋ฆฌ๋ ํ์์ ์ ์ต์ ํ๋์ด์๊ณ , ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ค๋ ๋๋ฅผ ์ฐจ๋จํด์ CPU ๋ฆฌ์์ค๋ฅผ ์๋ชจํ์ง ์๋ ๊ฒ์ด ํน์ง์ด๋ค.
๋๋ถ๋ถ์ ์ธ์ด์์ ๊ธฐ๋ณธ ๋ชจ๋๋ก ์ ๊ณตํ๋ค.
C++์์๋ "condition_variable", Rust๋ "CondVar", Go๋ sync.Cond, Java๋ Condition์ด๋ ์ด๋ฆ์ผ๋ก ๋ค์ด๊ฐ์๋ค.
๋ค์์ ๊ฐ๋จํ ์์ ์ฝ๋๋ค.
go
rust
wait์ ํตํด ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ฑ ๊ธฐ๋ค๋ฆฌ๊ณ , notify๋ฅผ ํตํด ์ฐจ๋จ๋ ์ค๋ ๋๋ฅผ ๊นจ์ธ ์ ์๋ค.
๋ชจ๋ ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋ notify_all๊ณผ ํ๋๋ง ๊นจ์ฐ๋ notify_one 2๊ฐ์ง๊ฐ ์ ๊ณต๋๋ค.
๋ค๋ฅธ ๋๊ธฐํ ์๋จ๊ณผ ์ ๋
๋ค๋ฅธ ๋ถ๋ถ์, ๋จ๋
์ผ๋ก ์ฐ์ด๋๊ฒ ์๋๋ผ Mutex์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด์๋ค๋ ๊ฒ์ด๋ค.
go๋ ์์ CondVar์ ์์ฑ์์ Mutex๋ฅผ ๋ฃ๋ ์์ผ๋ก ๋ง๋ค์ด์ ธ์๋ค.
๊ตฌํ ์์ค์์๋ mutex์ ๊ฐํ๊ฒ ์์กดํ๋ค.
Rust์ ๊ฒฝ์ฐ์๋ spin loop ์์ด futex syscall์ ๊ณง์ฅ ๋ ๋ฆฌ๋ ํํ๋ก ๊ตฌํ์ด ๋๋ค.


futex ๊ธฐ๋ฐ์ผ๋ก ์ฆ์ wait์ ๊ฑธ๊ณ
notify๋ฅผ ๋ณด๋ฉด futex awake๋ฅผ ๋ ๋ฆฐ๋ค.
ํ์ฉ ์์ ์ด์
๊ทธ๋์ ์ด๊ฑธ ์, ์ด๋จ ๋ ์ฐ๋๊ฑธ๊น? ์ฒ์ ์ ํ๋ค๋ฉด ๊ฝค ํผ๋์ค๋ฌ์ธ ์๋ ์๋ค.
๊ธฐ์ค ์ค๋ ๋ safeํ๊ฒ ๊ธฐ๋ค๋ฆฌ๋ ํ์ ์์ฒด๋ Mutex๋ก๋ ๋ฌ์ฑ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
Mutex์ lock๋ ์ค์ ๋ก ๋๊ธฐ ์ํ์ ๋น ์ง๋ฉด ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ค.
๋ฌผ๋ก ๋ถํ์ํ spin loop๊ฐ ์๊ธฐ ๋๋ฌธ์ CondVar๋ณด๋ค๋ ๋น์ฉ์ด ๋น์ธ๋ค.
CondVar๊ฐ ํ์ํด์ง๋ ์ง์ ์, ๊ณต์ ๋๋ ๊ฐ ์ ๊ทผ๊ณผ ๋ณ๊ฐ๋ก ์ฃผ์ฒด์ ์ผ๋ก ๋๊ธฐ/์ฌ์์์ ํด์ผ ํ ๋๋ค.
Mutex์ lock์์ ๋ฐ์ํ๋ ๋๊ธฐ๋ ๋จ์ํ๊ฒ "ํ๋ ๋นผ๊ณ ์ ๋ถ ๋๊ธฐ"์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌํํ๊ธฐ ๊น๋ค๋กญ๊ณ ๋นํจ์จ์ ์ด๋ค.
vs ์ฑ๋
condvar์ ์ง์ ์ ์ผ๋ก ๋น๊ตํ ์ ์๋ ๋์์ ์ฑ๋์ผ ๊ฒ์ด๋ค.
https://blog.naver.com/sssang97/223131767231
์ฑ๋์ condvar์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น๋ฒํ wait/wake ํจํด ์ฒ๋ฆฌ๋ฅผ ์ํ ๋๊ธฐํ ์๋จ์ด๋ค.
receiver๋ ์ด๋ฒคํธ๊ฐ ์์ผ๋ฉด wait ์ํ์ ๋น ์ง๊ณ , sender๊ฐ ๊ฐ๊ณผ ํจ๊ป wake๋ฅผ ๋ ๋ฆฌ๋ฉด ๊นจ์ด๋๋ ์์ผ๋ก ๋์ํ๋ค.
๋จ์ผ ์ค๋ ๋๊ฐ wait์ ํ๊ณ 1๊ฐ ์ด์์ ์ค๋ ๋๊ฐ notify๋ฅผ ํ๋(mpsc) ๊ฒฝ์ฐ์๋ ์ฑ๋์ด ๋ ์ ํฉํ๊ณ ๊น๋ํ๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ ์ฑ๋์ ๋จผ์ ๊ณ ๋ คํด๋ณด๊ณ , receiver๊ฐ ์ฌ๋ฌ๊ฐ๊ฐ ๋๋ ๋ฑ ์ฑ๋์ ๊ธฐ๋ฅ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฒ ๋๋ฉด convar๋ฅผ ํตํด ์ ์ด๋ฅผ ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์ฐธ์กฐ
https://doc.rust-lang.org/stable/std/sync/struct.Condvar.html
https://medium.com/@abhisheksagar_59776/mutex-vs-condition-variables-e0a15b2226a4