Rust の Arc を使った共有所有権

RustRustBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、スレッド間で共有所有権が必要な場合に使用されるRustのArc(原子的参照カウント)の使用方法を探ります。

注: 実験でファイル名が指定されていない場合は、好きなファイル名を使用できます。たとえば、main.rsを使用して、rustc main.rs &&./main でコンパイルして実行できます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/MemorySafetyandManagementGroup(["Memory Safety and Management"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/ControlStructuresGroup(["Control Structures"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/ControlStructuresGroup -.-> rust/for_loop("for Loop") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/MemorySafetyandManagementGroup -.-> rust/lifetime_specifiers("Lifetime Specifiers") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-99264{{"Rust の Arc を使った共有所有権"}} rust/type_casting -.-> lab-99264{{"Rust の Arc を使った共有所有権"}} rust/for_loop -.-> lab-99264{{"Rust の Arc を使った共有所有権"}} rust/function_syntax -.-> lab-99264{{"Rust の Arc を使った共有所有権"}} rust/expressions_statements -.-> lab-99264{{"Rust の Arc を使った共有所有権"}} rust/lifetime_specifiers -.-> lab-99264{{"Rust の Arc を使った共有所有権"}} rust/method_syntax -.-> lab-99264{{"Rust の Arc を使った共有所有権"}} end

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でさらに多くの実験を行って練習してください。