소개
Send 및 Sync 트레이트를 사용한 확장 가능한 동시성에 오신 것을 환영합니다. 이 랩은 Rust Book의 일부입니다. LabEx 에서 Rust 기술을 연습할 수 있습니다.
이 랩에서는 Rust 의 두 가지 동시성 개념인 Send 및 Sync 트레이트를 살펴봅니다. 이 트레이트는 표준 라이브러리를 넘어 확장 가능한 동시성 기능을 제공합니다.
Send 및 Sync 트레이트를 사용한 확장 가능한 동시성
흥미롭게도 Rust 언어는 동시성 기능이 매우 적습니다. 이 장에서 지금까지 논의한 거의 모든 동시성 기능은 언어가 아닌 표준 라이브러리의 일부였습니다. 동시성을 처리하는 옵션은 언어나 표준 라이브러리에 국한되지 않습니다. 자신만의 동시성 기능을 작성하거나 다른 사람이 작성한 기능을 사용할 수 있습니다.
하지만 두 가지 동시성 개념이 언어에 내장되어 있습니다: std::marker 트레이트인 Send 및 Sync입니다.
Send 를 사용하여 스레드 간 소유권 이전 허용하기
Send 마커 트레이트는 Send를 구현하는 타입의 값에 대한 소유권이 스레드 간에 이전될 수 있음을 나타냅니다. 거의 모든 Rust 타입은 Send이지만, Rc<T>를 포함하여 몇 가지 예외가 있습니다. Rc<T> 값을 복제하고 복제본의 소유권을 다른 스레드로 이전하려고 시도하면 두 스레드 모두 동시에 참조 카운트를 업데이트할 수 있기 때문에 Send가 될 수 없습니다. 이러한 이유로 Rc<T>는 스레드 안전 성능 페널티를 지불하고 싶지 않은 단일 스레드 상황에서 사용하도록 구현되었습니다.
따라서 Rust 의 타입 시스템과 트레이트 바운드는 Rc<T> 값을 스레드 간에 안전하지 않게 실수로 전송하는 일이 없도록 보장합니다. Listing 16-14 에서 이 작업을 시도했을 때, the trait Send is not implemented for Rc<Mutex<i32>> 오류가 발생했습니다. Send인 Arc<T>로 전환했을 때 코드가 컴파일되었습니다.
Send 타입으로 완전히 구성된 모든 타입은 자동으로 Send로 표시됩니다. 원시 포인터를 제외하고 거의 모든 기본 타입은 Send입니다. 원시 포인터는 19 장에서 논의할 것입니다.
Sync 를 사용하여 여러 스레드에서 접근 허용
Sync 마커 트레이트는 Sync를 구현하는 타입이 여러 스레드에서 참조되는 것이 안전함을 나타냅니다. 즉, 타입 T가 &T (T 에 대한 불변 참조) 가 Send인 경우, 즉 참조가 다른 스레드로 안전하게 전송될 수 있는 경우 Sync입니다. Send와 유사하게 기본 타입은 Sync이며, Sync인 타입으로 완전히 구성된 타입도 Sync입니다.
스마트 포인터 Rc<T>도 Send가 아닌 동일한 이유로 Sync가 아닙니다. RefCell<T> 타입 (15 장에서 이야기했습니다) 과 관련 Cell<T> 타입군은 Sync가 아닙니다. RefCell<T>가 런타임에 수행하는 차용 검사 (borrow checking) 구현은 스레드 안전하지 않습니다. 스마트 포인터 Mutex<T>는 Sync이며, "여러 스레드 간 Mutex<T> 공유"에서 보았듯이 여러 스레드와 접근을 공유하는 데 사용할 수 있습니다.
Send 및 Sync 수동 구현은 안전하지 않음
Send 및 Sync 트레이트로 구성된 타입은 자동으로 Send 및 Sync이 되므로, 해당 트레이트를 수동으로 구현할 필요가 없습니다. 마커 트레이트이므로 구현할 메서드조차 없습니다. 이들은 단지 동시성과 관련된 불변성을 적용하는 데 유용합니다.
이러한 트레이트를 수동으로 구현하는 것은 unsafe Rust 코드를 구현하는 것을 포함합니다. 19 장에서 unsafe Rust 코드 사용에 대해 이야기할 것입니다. 현재로서는, Send 및 Sync 부분으로 구성되지 않은 새로운 동시성 타입을 구축하려면 안전 보장을 유지하기 위해 신중한 고려가 필요하다는 것이 중요한 정보입니다. https://doc.rust-lang.org/stable/nomicon에 있는 "The Rustonomicon"은 이러한 보장과 이를 유지하는 방법에 대한 더 많은 정보를 제공합니다.
요약
축하합니다! Send 및 Sync 트레이트를 사용한 확장 가능한 동시성 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.