[Rust] Lock Poison ๋ฌธ์
Lock Poison์ Rust์์ ํ์ค mutex๋ฅผ ์ฌ์ฉํ ๋ ์์ด์ ์ฃผ์ํ ์ ์ค ํ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก mutex๋ ์๋์ ๊ฐ์ ํํ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
mutex๋ก ์นด์ดํฐ ๊ฐ์ ๋๊ณ , ๋ณ๋ ์ค๋ ๋์์ 1 ์ฆ๊ฐ, ๋ฉ์ธ์ค๋ ๋์์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๋น์ฅ ๋ณด๊ธฐ์ ๋ณ๋ก ๋ฌธ์ ๊ฐ ์๋ ์ฝ๋๋ ์๋๋ค.
์กฐ๊ธ ๊ฑฐ์ฌ๋ฆฌ๋ ์ ์ unwrap()์ด ์ข ์๋ค๋ ๊ฒ์ด๋ค.
Rust์ Mutex::lock() ํจ์๋ ์ ํญ์ Result๋ก ๊ฐ์ ๋ฐํํ ๊น? ์์์ ์ธ ๋ช
๋ น์ธ๋ฐ ์คํจํ ์ด์ ๊ฐ ์๋?
์ฌ์ค ์ด๋ ์ค๋ ๋ ๋จ์์ ํจ๋ ๋ฐ์์ ๋์ํ๊ธฐ ์ํ ๋ถ๋ถ์ด๋ค.
์ค๋ ๋์ ํจ๋
Rust์์ ํจ๋์ ์ค๋ ๋ ๋จ์์์ ๋
๋ฆฝ์ ์ด๋ค.
๋ค์ ๋งํด์, ํ ์ค๋ ๋๊ฐ ํจ๋์ผ๋ก ํฐ์ง๋๋ผ๋, ๋ค๋ฅธ ์ค๋ ๋์ ์ํฅ์ ์ฃผ์ง๋ ์๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ฉ์ธ์ค๋ ๋์์ ํจ๋์ ํฐ๋จ๋ฆฌ๋ฉด ๋น์ฅ ํ๋ก๊ทธ๋จ์ด ๋๋์ง๋ง, ๋ณ๋ ์ค๋ ๋์์ ํจ๋์ด ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ํจ๋ trace๋ง ๋จ๊ณ ํ๋ก๊ทธ๋จ์ด ์ฃฝ์ง๋ ์๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋... ํจ๋์ด ๋ฐ์ํ ์ค๋ ๋์์ ๊ฐ๊ณตํ mutex์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฏฟ์ ์ ์๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, mutex ๊ฐ๋๊ฐ ์ด์์๋ ์ํ์์ ํจ๋์ด ๋ฐ์ํ๋ฉด ํด๋น mutex๋ ์ ๋ขฐํ ์ ์๋ ์ํ๊ฐ ๋๋ค.
์ด๋ฅผ Lock Poison์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ์ ๋๋ ๋ฉ์ธ์ค๋ ๋์์์ lock().unwrap()์ด ํจ๋์ ๋์ง ๊ฒ์ด๋ค.

Poison ํ๋ณตํ๊ธฐ
์ผ๋จ, poison์ด ๋ฐ์ํ ์ํ์ mutex์์ ๊ฐ์ ์ฝ์ด์ค๋ ๊ฒ์ ์ด๋ ต์ง ์๋ค.
์ค๋ฅ ๊ฐ์ฒด์ ๊ฐ์ด ๋ค์ด์๋ค.
๋ค๋ง ์ด๋๋ก๋ ์ฌ์ฉ์ด ์ข ๋ถํธํ ๊ฒ์ด ์ฌ์ค์ด๋ค.
์ค๋ฅ ๊ฐ์ฒด๋ฅผ ํตํด์ ๊ฐ์ ์ฝ์ด์ฌ ์๋ ์์ง๋ง poison ์ํ๋ ๊ณ์ํด์ ์ ์ง๋๋ค.
ํ์ง๋ง unstable ๊ธฐ๋ฅ์ ์ด์ฉํ๋ค๋ฉด poison ์ํ๋ฅผ ํด์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅ์ ํ๋ค.
ํ๋๊ทธ ์ด๊ณ
#![feature(mutex_unpoison)]
clear_poison์ผ๋ก poison ์ํ๋ฅผ ํด์ ํด์ฃผ๋ฉด ๋๋ค.

๊ทธ๋ผ ๋ค์๋ถํฐ๋ ์ ์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก lock ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง ๊ฒ์ด๋ค.
๋นจ๋ฆฌ ์์ ํ๊ฐ ๋์ผ๋ฉด ํ๋ ๊ธฐ๋ฅ ์ค ํ๋๋ค.
์๋ํํฐ: tokio์ ๊ฒฝ์ฐ
tokio Mutex์ ๊ฒฝ์ฐ์๋ poisoning์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋ฐ๋ก ๊ตฌํ๋์ด์์ง๋ ์๋ค.
๊ทธ๋์ ์ค๋ ๋์์ ํจ๋์ด ๋จ๋๋ผ๋

์คํ์ ์ ๋๋ค.

์ฐธ์กฐ
https://users.rust-lang.org/t/mutex-poisoning-why-and-how-to-recover/72192/17
https://doc.rust-lang.org/nomicon/poisoning.html
https://doc.rust-lang.org/std/sync/struct.Mutex.html