Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
1068 of 1246 menu
◀ ▶

Метод 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,
    которая предоставляет доступ к данным и освобождает блокировку при удалении
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить