Sync ve Send Tanımlarıyla Genişletilebilir Eşzamanlılık

İlginç bir şekilde, Rust dili çok az eşzamanlılık özelliğine sahiptir. Bu bölümde şimdiye kadar bahsettiğimiz neredeyse tüm eşzamanlılık özellikleri dilin değil, standart kütüphanenin bir parçasıydı. Eşzamanlılığı ele almak için seçenekleriniz dil veya standart kütüphane ile sınırlı değildir; kendi eşzamanlılık özelliklerinizi yazabilir veya başkaları tarafından yazılanları kullanabilirsiniz.

Ancak, iki eşzamanlılık kavramı dilin içine yerleştirilmiştir: std::marker tanımları Sync ve Send.

Send ile İş Parçacıkları Arasında Sahiplik Aktarımına İzin Verme

Send işaretleyici tanımı, Send'i sürekleyen türdeki değerlerin sahipliğinin iş parçacıkları arasında aktarılabileceğini gösterir. Hemen hemen her Rust türü Send'dir, ancak Rc<T> gibi bazı istisnalar vardır: bu tür Send olamaz, çünkü bir Rc<T> değerini klonlarsanız ve klonun sahipliğini başka bir iş parçacığına aktarmaya çalışırsanız, her iki iş parçacığı da referans sayısını aynı anda güncelleyebilir. Bu nedenle Rc<T>, iş parçacığı güvenli performans cezasını ödemek istemediğiniz tek iş parçacıklı durumlarda kullanılmak üzere uygulanmıştır.

Bu nedenle, Rust'ın tür sistemi ve tanım bağlılığı, bir Rc<T> değerini asla yanlışlıkla iş parçacıkları arasında güvenli olmayan bir şekilde gönderemeyeceğinizi garanti eder. Bunu Liste 16-14'te yapmaya çalıştığımızda, Send tanımının Rc<Mutex<i32>> için süreklenmediği hatasını almıştık. Send'i süreklemiş Arc<T>'ye geçtiğimizde kod derlendi.

Tamamen Send türlerinden oluşan herhangi bir tür de otomatik olarak Send olarak işaretlenir. Bölüm 19'da tartışacağımız ham işaretçiler dışında neredeyse tüm ilkel tipler Send'dir.

Sync ile Birden Fazla İş Parçacığından Erişime İzin Verme

Sync işaretleyici tanımı, Sync'i sürekleyen türe birden fazla iş parçacığından başvurulmasının güvenli olduğunu belirtir. Başka bir deyişle, &T (T'ye değişmez bir referans) Send ise herhangi bir T türü Sync'tir, yani referans başka bir iş parçacığına güvenle gönderilebilir. Send'e benzer şekilde, ilkel tipler Sync'tir ve tamamen Sync olan tiplerden oluşan tipler de Sync'tir.

Akıllı işaretçi Rc<T> de Send olmamasıyla aynı nedenlerden dolayı Sync değildir. RefCell<T> türü (Bölüm 15'te bahsetmiştik) ve ilgili Cell<T> türleri ailesi Sync değildir. RefCell<T>'nin çalışma zamanında yaptığı ödünç alma denetimi uygulaması iş parçacığı güvenli değildir. Akıllı işaretçi Mutex<T> Sync'tir ve “Bir Mutex<T>'i Birden Fazla İş Parçacığı Arasında Paylaşma” bölümünde gördüğünüz gibi erişimi birden fazla iş parçacığı ile paylaşmak için kullanılabilir.

Send ve Sync'i Manuel Olarak Süreklemek Güvenli Değildir

Send ve Sync tanımlarından oluşan türler otomatik olarak Send ve Sync özelliklerine de sahip olduğundan, bu özellikleri manuel olarak süreklememiz gerekmez. İşaretleyici tanımlar olarak, süreklenecek herhangi bir metodları bile yoktur. Sadece eşzamanlılıkla ilgili değişmezleri uygulamak için kullanışlıdırlar.

Bu tanımların manuel olarak uygulanması, güvenli olmayan Rust kodunun uygulanmasını gerektirir. Güvensiz Rust kodunun kullanımı hakkında Bölüm 19'da konuşacağız; şimdilik önemli bilgi, Send ve Sync parçalarından oluşmayan yeni eşzamanlı türler oluşturmanın güvenlik garantilerini korumak için dikkatli düşünmeyi gerektirdiğidir. “The Rustonomicon” bu garantiler ve bunların nasıl korunacağı hakkında daha fazla bilgi içerir.

Özet

Bu kitapta eşzamanlılıkla ilgili göreceğiniz son şey bu değil: Bölüm 20'deki proje, bu bölümdeki kavramları burada tartışılan küçük örneklerden daha gerçekçi bir durumda kullanacaktır.

Daha önce de belirtildiği gibi, Rust'ın eşzamanlılığı nasıl ele aldığının çok azı dilin bir parçası olduğu için, birçok eşzamanlılık çözümü kasa olarak süreklenmektedir. Bunlar standart kütüphaneden daha hızlı gelişir, bu nedenle çok iş parçacıklı durumlarda kullanılacak güncel, son teknoloji ürünü kasalar için doğru çevrimiçi arama yaptığınızdan emin olun.

Rust standart kütüphanesi, mesaj geçişi için kanallar ve eş zamanlı bağlamlarda kullanımı güvenli olan Mutex<T> ve Arc<T> gibi akıllı işaretçi türleri sağlar. Tür sistemi ve ödünç denetleyicisi, bu çözümleri kullanan kodun veri yarışları veya geçersiz referanslarla sonuçlanmamasını sağlar. Kodunuzun derlenmesini sağladıktan sonra, diğer dillerde yaygın olan izlenmesi zor hata türleri olmadan birden fazla iş parçacığında mutlu bir şekilde çalışacağından emin olabilirsiniz. Eşzamanlı programlama artık korkulacak bir kavram değil: gidin ve programlarınızı korkusuzca eşzamanlı hale getirin!

Daha sonra, Rust programlarınız büyüdükçe sorunları modellemenin ve çözümleri yapılandırmanın deyimsel yollarından bahsedeceğiz. Ayrıca, Rust'ın deyimlerinin nesne yönelimli programlamadan aşina olabileceğiniz deyimlerle nasıl ilişkili olduğunu tartışacağız.