우리는 (Tokio를 통한) 멀티스레딩을 사용한다. 다시 말해, Arc<T>를 사용하여 데이터 저장소를 래핑해야 한다. 하지만 이것은 솔루션의 일부분이다. 동일한 Store를 읽는 것은 괜찮지만, 변경할 수도 있어야 한다. 한 스레드의 HTTP POST 요청으로 질문을 추가할 수 있고 다른 스레드의 HTTP PUT 요청으로 기존 질문을 변경하려고 할 수도 있다.
그러니 다른 솔루션을 찾아야 한다. 러스트는 이런 상황에도 대응할 수 있는 기능을 가지고 있다. 다음 두 가지 타입 중 하나를 사용할 수 있다.
• Mutex
• RwLock
둘 다 읽는 주체와 쓰는 주체가 해당 데이터에 대한 고유한 권한을 가지고 있는지 확인한다. 쓰는 주체나 읽는 주체가 접근을 요청하면 바로 데이터를 잠그고 이전의 작업이 완료되면 다음 작업을 위해서 잠금을 풀어 준다. 차이점은 Mutex가 한 번에 쓰기나 읽기 하나만 허용하고 나머지는 차단하는 반면, RwLock은 읽기를 여러 개 허용하고 쓰기는 하나만 허용한다는 점이다.
그러나 조심해야 한다. Rc, Arc 두 타입 모두 동기 작업에 중점을 둔 std::sync 모듈의 일부이므로 비동기 환경에는 적합하지 않다. 비동기 환경에서는 RwLock 타입의 구현을 사용할 수 있으므로 이를 프로젝트에 추가해야 한다.