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()
را در مورد خطا برای بازیابی دادهها بدون توجه به آن فراخوانی کنید.
- اگر threadای که