Send 및 Sync 를 사용한 확장 가능한 동시성

Beginner

This tutorial is from open-source community. Access the source code

소개

Send 및 Sync 트레이트를 사용한 확장 가능한 동시성에 오신 것을 환영합니다. 이 랩은 Rust Book의 일부입니다. LabEx 에서 Rust 기술을 연습할 수 있습니다.

이 랩에서는 Rust 의 두 가지 동시성 개념인 SendSync 트레이트를 살펴봅니다. 이 트레이트는 표준 라이브러리를 넘어 확장 가능한 동시성 기능을 제공합니다.

Send 및 Sync 트레이트를 사용한 확장 가능한 동시성

흥미롭게도 Rust 언어는 동시성 기능이 매우 적습니다. 이 장에서 지금까지 논의한 거의 모든 동시성 기능은 언어가 아닌 표준 라이브러리의 일부였습니다. 동시성을 처리하는 옵션은 언어나 표준 라이브러리에 국한되지 않습니다. 자신만의 동시성 기능을 작성하거나 다른 사람이 작성한 기능을 사용할 수 있습니다.

하지만 두 가지 동시성 개념이 언어에 내장되어 있습니다: std::marker 트레이트인 SendSync입니다.

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>> 오류가 발생했습니다. SendArc<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 수동 구현은 안전하지 않음

SendSync 트레이트로 구성된 타입은 자동으로 SendSync이 되므로, 해당 트레이트를 수동으로 구현할 필요가 없습니다. 마커 트레이트이므로 구현할 메서드조차 없습니다. 이들은 단지 동시성과 관련된 불변성을 적용하는 데 유용합니다.

이러한 트레이트를 수동으로 구현하는 것은 unsafe Rust 코드를 구현하는 것을 포함합니다. 19 장에서 unsafe Rust 코드 사용에 대해 이야기할 것입니다. 현재로서는, SendSync 부분으로 구성되지 않은 새로운 동시성 타입을 구축하려면 안전 보장을 유지하기 위해 신중한 고려가 필요하다는 것이 중요한 정보입니다. https://doc.rust-lang.org/stable/nomicon에 있는 "The Rustonomicon"은 이러한 보장과 이를 유지하는 방법에 대한 더 많은 정보를 제공합니다.

요약

축하합니다! Send 및 Sync 트레이트를 사용한 확장 가능한 동시성 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.