Введение
В этом лабе мы исследуем использование Arc (атомарно подсчитываемая ссылка) в Rust, которое используется, когда требуется разделенная собственность между потоками.
Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать
main.rs, скомпилировать и запустить его с помощьюrustc main.rs &&./main.
Arc
Когда требуется разделенная собственность между потоками, можно использовать Arc (атомарно подсчитываемая ссылка). Эта структура, с помощью реализации Clone, может создать указатель на место значения в куче памяти, увеличивая счетчик ссылок. Поскольку она разделяет собственность между потоками, когда последний указатель на значение выходит из области видимости, переменная удаляется.
use std::time::Duration;
use std::sync::Arc;
use std::thread;
fn main() {
// В этом объявлении переменной указывается ее значение.
let apple = Arc::new("the same apple");
for _ in 0..10 {
// Здесь не указывается значение, так как это указатель на
// ссылку в куче памяти.
let apple = Arc::clone(&apple);
thread::spawn(move || {
// Поскольку использовался Arc, потоки можно создавать с использованием
// значения, выделенного в месте указателя переменной Arc.
println!("{:?}", apple);
});
}
// Убедитесь, что все экземпляры Arc распечатаны из созданных потоков.
thread::sleep(Duration::from_secs(1));
}
Резюме
Поздравляем! Вы завершили лабу по Arc. Вы можете практиковаться в более многих лабах в LabEx, чтобы улучшить свои навыки.