###### tags: `Rust` `Box` `Cell` `RefCell` `Arc` `Mutex` `ReLock` # Better Rust 3 # 保証 保証とは、プログラムにおいて変数にアクセスできることの保証を指す - それを参照するすべてのポインタがスコープから外れるまで、データが破壊されないこと 保証と実行コスト(速度)はトレードオフ [TOC] # ラッパ型 スタックやヒープに割り当てられた値を、そのまま使うのではなく 便利機能を持ったポインタ型でラップして使う ## Box\<T> ボックス = 所有されるポインタ ヒープアロケートされた値は、ポインタ参照により利用するが、 Boxはその唯一の所有権をもつ。 できること - 所有権の移動 - 関数外への所有権の移動 - Box型変数がスコープ外になったとき、デストラクタ実行でデータ開放 これらは動的割当のゼロコスト抽象化であり、 ヒープを安全に使いたいときの理想である。 ## Rc\<T> Rc = Reference counter = 参照カウントを持つポインタ あるデータを所有する複数のポインタを作成できる。 参照カウントは、Rcがcloneされるたびに1増加 Rcがスコープ外に出るたびに1減少 Boxと異なり、ゼロコストではなく実行コストが掛かる。 # セル型 内的ミュータビリティを提供 (構造体のプロパティに使うと、その構造体をimutableで宣言しても変更できる) - Cell\<T> - RefCell\<T> - UnsafeCell\<T> # 同期型 並列処理のときに、同じリソースを同時に使用させない - Arc\<T> : Rc の アトミックバージョン(なのでArc) - 並列処理のスレッドも含めて、リソースを参照しているポインタ数をカウント - カウントが0にならない限り、リソースを開放しない - Mutex\<T> - リソースのロック - RAIIガード - - RwLock\<T> - リソースのロック - Reader writer ロック - 複数の読み込みを効率化 RAII = Resource Acquisition Is オブジェクトがスコープを抜けるとデストラクタが呼び出されて オブジェクトのリソースが開放されること RAIIガード Mutex と RwLock で使われているロジック 1. とあるスレッドがmutex.lock()を作成 2. 別のスレッドがmutex.lock()を作成しようとする 3. 最初のmutex.lock()が処理継続中(スコープ内)で、リソースが開放されていない 4. 別スレッドは.lock()できるまで待機 サンプル ```rust= { let guard = mutex.lock(); // ガードがミュータブルに内部の型への参照を外す *guard += 1; } // デストラクタが実行されるときにロックは解除される ``` # ここで、Rustの基礎学習は終わり!
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up