보통 언어들의 공유 메모리 모델은 4가지다
1. 락은 있는데 실수를 잡아줄 방법은 전무한 방치형
2. 모든곳에 락을 걸어버리는 파이썬형
3. 수정이 불가능한 함수형
4. 애초에 스레드가 없는 자스형
장단점이 조금씩 있는데 Rust는 컴파일러가 실수안한 1번의 코드가 되도록 만들어준다
lock걸면 MutexGuard가 나와서 참조할수있고 소멸될때 락을 푸는 간단한 타입이고
이 타입을 만드는거 자체는 제네릭이랑 RAII가 있다면 어떤 언어든지 만들수는 있다
하지만 이걸 안전하게 쓸려면 수명이 필요해진다
C++에서 이걸 만들어서 &T를 얻었다고 쳤을때 &T를 살려두고
MutexGuard를 죽이는걸 막을 방법이 없다
lock이 보장하는건 MutexGuard까지만 이므로 이건 데이터 레이스를 유발할수있다
하지만 Rust에선 &mut T의 수명이 MutexGuard의 수명보다 짧아서
MutexGuard가 죽으면 &mut T를 쓸수없기 때문에 항상 한 스레드만 T의 참조를 얻을수 있는게 보장된다
댓글 1