Метод lock
Метод lock класса Mutex блокирует мьютекс,
ожидая освобождения блокировки, если она уже удерживается
другим потоком. После успешной блокировки метод возвращает
умный указатель MutexGuard, через который можно
получить доступ к защищаемым данным. Параметров метод не принимает.
Синтаксис
mutex.lock()
Пример
Давайте создадим мьютекс с числом и получим доступ к нему
через метод lock:
use std::sync::Mutex;
fn main()
{
let mutex = Mutex::new(12345);
let guard = mutex.lock().unwrap();
println!("{}", *guard);
}
Результат выполнения кода:
12345
Пример
Давайте изменим значение внутри мьютекса через полученный
указатель MutexGuard:
use std::sync::Mutex;
fn main()
{
let mutex = Mutex::new(String::from("abcde"));
{
let mut guard = mutex.lock().unwrap();
*guard = String::from("12345");
}
let guard = mutex.lock().unwrap();
println!("{}", *guard);
}
Результат выполнения кода:
"12345"
Пример
Давайте используем lock для безопасного изменения
данных из нескольких потоков:
use std::sync::{Arc, Mutex};
use std::thread;
fn main()
{
let mutex = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..5 {
let mutex = Arc::clone(&mutex);
let handle = thread::spawn(move || {
let mut guard = mutex.lock().unwrap();
*guard += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let guard = mutex.lock().unwrap();
println!("{}", *guard);
}
Результат выполнения кода:
5
Смотрите также
-
класс
Mutex,
который обеспечивает безопасный доступ к данным из нескольких потоков -
метод
new,
который создает новый мьютекс с указанным значением -
метод
try_lock,
который пытается заблокировать мьютекс без ожидания -
структура
MutexGuard,
которая предоставляет доступ к данным и освобождает блокировку при удалении