CodeBlanks Logo Icon CodeBlanks

static mut

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

main.rs
use std::sync::atomic::{AtomicUsize, Ordering};

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
static SAYAC: AtomicUsize = AtomicUsize::new(0);
SAYAC.____(1, Ordering::SeqCst);
Cevap
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

İleri seviye bölümündeki tüm dersler