Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Sync 트레이트

이 챕터를 마무리하기 전, Rust 표준 라이브러리의 또 다른 핵심 트레이트인 **Sync**에 대해 알아보겠습니다.

SyncSend와 마찬가지로 컴파일러가 자동으로 구현해 주는 **마커 트레이트(Marker trait)**입니다. 여러 스레드 사이에서 안전하게 **공유(Share)**될 수 있는 모든 타입은 Sync를 가집니다.

더 정확한 정의는 다음과 같습니다.

&T (공유 참조)가 Send라면, TSync입니다.

T: Sync라고 해서 T: Send인 것은 아닙니다

어떤 타입은 스레드 간에 **이동(Move)**하는 것은 불가능해도 **공유(Share)**하는 것은 가능할 수 있습니다. 예를 들어, MutexGuardSend가 아니지만 Sync입니다.

MutexGuardSend가 아닌 이유는 잠금을 얻은 바로 그 스레드에서만 해제되어야 하기 때문입니다. 하지만 다른 스레드에게 &MutexGuard를 보여주는 것은 잠금이 해제되는 위치와 상관없으므로 Sync가 될 수 있는 것이죠.

T: Send라고 해서 T: Sync인 것은 아닙니다

반대의 경우도 가능합니다. 한 스레드에서 다른 스레드로 완전히 이동시키는 것은 안전하지만, 여러 스레드가 동시에 공유하는 것은 위험한 경우죠. 대표적인 예가 **RefCell<T>**입니다.

RefCell<T>는 런타임에 빌림 검사를 수행하는데, 이때 사용하는 카운터가 스레드 간 동기화를 보장하지 않습니다. 만약 여러 스레드가 동시에 &RefCell을 가지고 데이터를 수정하려 하면 **데이터 경합(Data race)**이 발생하고 말 것입니다. 그래서 RefCellSync가 아닙니다. 하지만 소유권을 다른 스레드로 완전히 넘겨버리면(Send), 기존 스레드에는 아무런 참조가 남지 않으므로 안전합니다.

이처럼 SendSync는 Rust가 다중 스레드 환경에서도 메모리 안전성을 보장하기 위해 사용하는 아주 강력한 도구입니다.

Exercise

The exercise for this section is located in 07_threads/14_sync