シングルモードの実施例の錆

(マルチスレッドを含む、変数参照の複数の実現)補助の結論そのコードの最初の部分

use std::sync::Arc;
use std::sync::Mutex;

struct Point {
    pub x: u32,
    pub y: u32
}

impl Point {
    pub fn get_instance() -> Arc<Mutex<Point>> {
        static mut POINT: Option<Arc<Mutex<Point>>> = None;

        unsafe {// Rust中使用可变静态变量都是unsafe的
            POINT.get_or_insert_with(|| {
                // 初始化单例对象的代码
                Arc::new(Mutex::new(Point {x: 0, y: 0}))
            }).clone()
        }
    }
}
  • 使用Option<...>することにより、元のグローバルシングルトン・オブジェクト・ポインタを格納する静的変数としてget_or_insert_withシングルトンオブジェクトを初期化する方法
  • 最も厳格なアプローチが使用するものであるArc<Mutex<T>>か、Arc<RwLock<T>>シングルトンオブジェクトを保持するために、変数を直接シングルトンオブジェクトを参照する必要がない場合Arc<T>ができ、それは単一スレッドプログラムであれば、Arc使用することができるRc代替的

なぜボックスが、アーク/ RC?

ボックスは、クローンできないユニークなポインタ参照を表します。シングルトンオブジェクトは、複数のコードによって参照されるBox<T>だけできないクローンを移動することができ、1つを達成することは不可能であるBox<T>共有ポインタなどを。

状況は、変数の参照を必要としません。

いいえ変数参照する場合は、ミューテックスかは、rwlockを使用する必要はありません。返すことができますArc<T>&'static T

    pub fn get_instance() -> Arc<Point> {
        static mut POINT: Option<Arc<Point>> = None;

        unsafe {// Rust中使用可变静态变量都是unsafe的
            POINT.get_or_insert_with(|| {
                // 初始化单例对象的代码
                Arc::new(Point {x: 0, y: 0})
            }).clone()
        }
    }

    // 返回&'static Point
    pub fn get_instance() -> &'staic Point {
        static mut POINT: Option<Arc<Point>> = None;

        unsafe {// Rust中使用可变静态变量都是unsafe的
            POINT.get_or_insert_with(|| {
                // 初始化单例对象的代码
                Arc::new(Point {x: 0, y: 0})
            });
            POINT.as_ref().unwrap()
        }
    }

おすすめ

転載: www.cnblogs.com/metaworm/p/11969270.html