متغیرهای ثابت قابل تغییر
خواندن یک متغیر استاتیک تغییرناپذیر بیخطر است:
static HELLO_WORLD: &str = "سلام دنیا!"; fn main() { println!("HELLO_WORLD: {HELLO_WORLD}"); }
بااینحال، از آنجایی که شرایط رقابتی دادهها ممکن است رخ دهد، خواندن و نوشتن متغیرهای mutable static ناامن است:
static mut COUNTER: u32 = 0; fn add_to_counter(inc: u32) { // SAFETY: There are no other threads which could be accessing `COUNTER`. unsafe { COUNTER += inc; } } fn main() { add_to_counter(42); // SAFETY: There are no other threads which could be accessing `COUNTER`. unsafe { println!("COUNTER: {COUNTER}"); } }
This slide should take about 5 minutes.
-
برنامه در اینجا امن است زیرا single-thread است. با این حال، کامپایلر Rust محافظه کار است و بدترینها را در نظر میگیرد.
unsafe
را حذف کنید و ببینید چگونه کامپایلر توضیح میدهد که جهش یک static از چندین thread یک رفتار تعریف نشده است. -
استفاده از یک static قابل تغییر (mutable) به طور کلی ایده بدی است، اما مواردی وجود دارد که ممکن است در کدهای سطح پایین
no_std
منطقی باشد، مانند اجرای یک heap allocator یا کار با برخی از APIهای مربوط به زبان C.