Встроенная модель параллелизма Rust, основанная на передаче сообщений и владении потоками, упрощает написание параллельного кода, который является одновременно безопасным и эффективным. Однако, когда нескольким потокам необходимо получить доступ к общему состоянию и изменить его, нам необходимо проявлять особую осторожность, чтобы гарантировать, что данные остаются согласованными и что доступ должным образом синхронизирован.
Встроенная модель параллелизма Rust, основанная на передаче сообщений и владении потоками, упрощает написание параллельного кода, который является одновременно безопасным и эффективным. Однако, когда нескольким потокам необходимо получить доступ к общему состоянию и изменить его, нам необходимо проявлять особую осторожность, чтобы гарантировать, что данные остаются согласованными и что доступ должным образом синхронизирован.
Одним из распространенных способов синхронизации доступа к общему состоянию в Rust является использование мьютекса. Мьютекс - это тип, который позволяет только одному потоку удерживать блокировку одновременно и блокирует другие потоки, которые пытаются получить блокировку, пока она не будет снята. Чтобы использовать мьютекс, нам сначала нужно создать его экземпляр, обернув общее состояние:
Затем, чтобы получить доступ к общему состоянию или изменить его, нам нужно получить блокировку, вызвав метод `lock`:
Метод `lock` возвращает `LockResult`, который содержит `MutexGuard`, удерживающий блокировку и разрешающий доступ к общему состоянию. Нам нужно вызвать `unwrap`, чтобы получить фактический `MutexGuard` и, таким образом, получить доступ к общему состоянию.
Когда мы закончим с общим состоянием, блокировка автоматически снимается, когда `MutexGuard` выходит за пределы области видимости.
Важно иметь в виду, что, хотя мьютекс предоставляет способ синхронизации доступа к общему состоянию, он также может привести к проблемам с производительностью при чрезмерном или ненадлежащем использовании. Таким образом, лучше всего использовать его как можно реже и только при необходимости.
Статья на list-site.