(マルチスレッドを含む、変数参照の複数の実現)補助の結論そのコードの最初の部分
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()
}
}