ProgramlamaSistem/backend ve Gömülü geliştirici

Rust'ta global değişkenlerle (static) çalışma kurallarını açıklar mısınız? Aynı anda erişim sırasında güvenlik nasıl sağlanır ve farklı başlangıç ve senkronizasyon yöntemleri nelere benzer?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Rust'ta global değişkenler static anahtar kelimesi ile ilan edilir. Bu tür değişkenler programın çalışma süresince canlıdır. Varsayılan olarak, değiştirilemez static erişimi güvenlidir, ancak değiştirilebilenler için unsafe kullanmak gereklidir, çünkü derleyici, konu yarışlarını önleyip önleyemeyeceği konusunda garanti veremez.

Değiştirilebilen global değişkenlere güvenli erişim sağlamak için özel sarıcı türler kullanılır: Mutex, RwLock, Atomic* türler veya harici crate'ler (lazy_static, once_cell). "Tembel" başlatma kullanılır; bu, objenin ilk çağrıda oluşturulmasını sağlar.

Örnekler:

static COUNTER: AtomicUsize = AtomicUsize::new(0); static ref CONFIG: Config = read_config(); // lazy_static veya once_cell ile

Kandırmaca Soru

Sadece bir thread'den kullanılacaksa, özel türler olmadan bir değiştirilebilir global değişken ilan edilebilir mi? unsafe yazmak gerekli mi?

Cevap: Derleyici, global değişken üzerinde herhangi bir değişiklik yapıldığında unsafe kullanmamızı isteyecektir, hatta mantık tek iş parçacıklı olsa bile. Bu, tüm static mut'lar için genel bir gerekliliktir. Sadece değişken bir senkronizasyon yapısına (örn. Mutex, atomik vb.) sarılmışsa, derleyici güvenli erişime izin verir.

static mut VALUE: i32 = 0; unsafe { VALUE += 1; }

Konunun inceliklerinden kaynaklanan gerçek hata örnekleri


Hikaye

Bir web servisinde global bir cache'in başlatılması sırasında, birkaç iş parçacığı aynı anda bir dize yazdığı sıradan bir static değişken kullanıldı. Bunun sonucunda "bellek parçaları" ortaya çıktı ve uygulama iş parçacığı yarışı nedeniyle çöküntüler yaşandı.


Hikaye

Rust üzerinde bir komut satırı aracında, "sadece main üzerinden çalışıyor" olduğu için senkronizasyon olmadan statik bir değişken değiştirildi. Daha sonra, çoklu iş parçacığı için kod kapsülendi ama global değişken durumunu unuttular ve bu çok zor bulunan hatalara yol açtı.


Hikaye

Bir gömülü programda, başlangıçta CONFIG'i başlatırken bir fonksiyon aracılığıyla yanlış başlatıldı, ama bunun tam olarak bir kez çağrılacağını garanti etmediler. Sonuç olarak, bazı kod parçaları başlatılmamış bir konfigürasyona (null referansı) başvurdular.