Продолжаю изучать
Rust и добрался до
Mutex. После
NSLock в
Swift вижу интересные отличия в подходах к синхронизации потоков!
Swift с NSLock:
let lock = NSLock()
var counter = 0
func increment() {
lock.lock()
counter += 1
lock.unlock()
}
Rust с Mutex:
use std::sync::Mutex;
let counter = Mutex::new(0); // Данные внутри Mutex
fn increment() {
let mut num = counter.lock().unwrap(); // Автоматический lock
*num += 1;
} // Автоматический unlock при выходе из области видимости
В
Rust Mutex непосредственно владеет данными, что полностью меняет подход к синхронизации. Мьютекс автоматически освобождается при выходе из области видимости, поэтому нет риска забыть вызвать
unlock() как в
Swift, что может вызвать
deadlock при вложенных блокировках.
В
Rust так же возможен
deadlock при сложных сценариях, но компилятор предотвращает многие ошибки доступа к памяти, дополнительно проверяя правильность работы с заблокированными данными, обеспечивая тем самым дополнительную безопасность.
Хотя синтаксис в
Rust выглядит неочевидным, зато работа мьютекса более безопасная.