Mutex

Mutex<T> تضمین می‌کند که حذف متقابل و امکان دسترسی قابل تغییر (mutable) به "T" را در پشت یکread-only interface (شکل دیگری از تغییرپذیری (mutable) داخلی) فراهم می‌کند.

use std::sync::Mutex;

fn main() {
    let v = Mutex::new(vec![10, 20, 30]);
    println!("v: {:?}", v.lock().unwrap());

    {
        let mut guard = v.lock().unwrap();
        guard.push(40);
    }

    println!("v: {:?}", v.lock().unwrap());
}

توجه کنید که چگونه یک impl<T: Send> Sync for Mutex<T> برای اجرای کامل آن داریم.

This slide should take about 14 minutes.
  • ‏«Mutex» در Rust مانند مجموعه‌ای با تنها یک عنصر --- داده‌های محافظت شده (protected) به نظر می‌رسد.
    • نمی‌توان قبل از دسترسی به داده‌های محافظت شده یا protected، دسترسی mutex را فراموش کرد.
  • با گرفتن lock می‌توانید &mut T را از &Mutex<T> دریافت کنید.MutexGuard تضمین می‌کند که&mut T بیشتر از قفل نگه‌داشته شده، موجود نمی‌ماند.
  • Mutex<T> هر دوی پیاده سازی Send و Sync iff (فقط و فقط) T از Send استفاده‌ می‌کنند.
  • ‏ همتای قفل خواندن و نوشتن: RwLock.
  • چرا lock() یکResult برمی‌گرداند؟
    • اگر threadای که Mutex را نگه می‌دارد دچار panic شود، Mutex «مسموم/poisoned» می‌شود تا نشان دهد که داده‌هایی که محافظت می‌کند ممکن است در وضعیت ناسازگاری باشند. فراخوانی lock() در یک mutex مسموم با یک [«PoisonError»] (https://doc.rust-lang.org/std/sync/struct.PoisonError.html) انجام نمی‌شود. می‌توانید into_inner() را در مورد خطا برای بازیابی داده‌ها بدون توجه به آن فراخوانی کنید.