前提
Rust で並行処理を行うプログラムを作ろうとしています。
既存の変数を、そのデータをコピーせずに、Mutex
や Arc
で包んだり、包みを外したりすることは可能でしょうか?
実現したいこと
例えば、次のプログラムを考えます。
Rust
1use std::sync::{Arc, Mutex}; 2use std::thread; 3 4fn main() { 5 6 let arr = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]; 7 let lock = Arc::new(Mutex::new(arr)); // <1> ここで、arr をコピーせずに包みたい 8 9 let lock0 = lock.clone(); 10 let th0 = thread::spawn(move || { 11 let mut arr = lock0.lock().unwrap(); 12 *arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; 13 }); 14 15 th0.join().unwrap(); 16 println!("{:?}", lock.lock().unwrap()); // [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 17 18 // <2> このあと、lock の包みを外して配列データを使用したい 19}
コメントの <1>
の箇所で、Arc<Mutex<[[i32; 3]; 3]>>
型を宣言していますが、アドレスを調べたところ、arr
のデータがコピーされて、Mutex
内に格納されているようです。ここで、arr
の所有権を奪い、コピーを行うことなく、Arc<Mutex<T>>
で包む方法はありますでしょうか?
それから、コメントの <2>
の箇所で、データをコピーすることなく包みを外す、つまり、再び [[i32; 3]; 3]
型を生成するような方法はありますでしょうか?
あるいは、配列コピーを行わずに Arc
や Mutex
を使用するならば、スコープの初めから最後まで一貫して包んでおくことしかできないのでしょうか?
ご回答よろしくお願いします。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。