static mut
- Rust kursu
- İleri seviye
- Ders 33/81
- 4 dk
static mut ile küresel değişken yönetimini öğrenirsin.
static mut
static değişkenler programın tüm ömrü boyunca tek bir adreste yaşar. static mut değiştirilebilir bir global sağlar ama her erişim unsafe'tir, çünkü iki thread aynı anda değiştirirse veri yarışı olur. Rust 2024 ile static mut'a referans almak varsayılan olarak hatadır:
static mut ESKI_SAYAC: u32 = 0;
unsafe {
ESKI_SAYAC += 1; // veri yarışına açık
}Modern Rust'ta neredeyse her zaman daha iyi bir seçenek vardır: atomik türler, Mutex, OnceLock ya da LazyLock.
Güvenli globaller
Atomik türler ve tembel başlatma, unsafe olmadan global durum sağlar:
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::LazyLock;
static SAYAC: AtomicUsize = AtomicUsize::new(0);
static AYARLAR: LazyLock<Vec<String>> = LazyLock::new(|| {
vec![String::from("varsayılan")] // ilk erişimde bir kez çalışır
});
SAYAC.fetch_add(1, Ordering::SeqCst);Ordering, diğer thread'lerin değişikliği hangi sırayla göreceğini belirler; emin değilsen SeqCst en güçlü ve en güvenli seçenektir.
Uygulama Atomik global sayaç
static SAYAC: AtomicUsize tanımla ve fetch_add ile artıran fn artir() yaz. artir'ı üç kez çağır ve load ile değeri yazdır.
Başlangıç kodu
use std::sync::atomic::{AtomicUsize, Ordering};
fn main() {
// buraya yaz
}Örnek çözüm
use std::sync::atomic::{AtomicUsize, Ordering};
static SAYAC: AtomicUsize = AtomicUsize::new(0);
fn artir() {
SAYAC.fetch_add(1, Ordering::SeqCst);
}
fn main() {
for _ in 0..3 {
artir();
}
println!("{}", SAYAC.load(Ordering::SeqCst));
}Beklenen çıktı
3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Thread'ler arası bir global sayaç için en uygun seçim hangisi?
- static SAYAC: AtomicUsize Doğru cevap
- static mut SAYAC: usize
- const SAYAC: usize
- let SAYAC
Açıklama: Atomikler unsafe gerektirmez ve veri yarışı oluşturmaz; static ile tanımlanabilirler çünkü iç değiştirilebilirlik sağlarlar.
2 Atomik artır
static SAYAC: AtomicUsize = AtomicUsize::new(0);
SAYAC.____(1, Ordering::SeqCst);
static SAYAC: AtomicUsize = AtomicUsize::new(0);
SAYAC.fetch_add(1, Ordering::SeqCst);
Açıklama: fetch_add değeri atomik olarak artırır ve eski değeri döndürür.
3 Global ve güvenlik
| Kavram | Anlamı |
|---|---|
static mut X |
Her erişim unsafe |
static X: AtomicUsize |
Güvenli |
LazyLock |
Tembel, güvenli başlatma |
const X |
Değişmez, satır içi |