質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
並列処理

複数の計算が同時に実行される手法

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

1回答

750閲覧

Rust で既存の変数を Mutex や Arc で包みたい

mitnasdf

総合スコア9

並列処理

複数の計算が同時に実行される手法

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

2クリップ

投稿2022/12/28 06:52

前提

Rust で並行処理を行うプログラムを作ろうとしています。

既存の変数を、そのデータをコピーせずに、MutexArc で包んだり、包みを外したりすることは可能でしょうか?

実現したいこと

例えば、次のプログラムを考えます。

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] 型を生成するような方法はありますでしょうか?

あるいは、配列コピーを行わずに ArcMutex を使用するならば、スコープの初めから最後まで一貫して包んでおくことしかできないのでしょうか?

ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

std::marker::Copy の説明の中にビットパターンのコピーについて言及があるのを見つけました。

箇条書きでまとめると

  • ムーブでもコピーでも同じようにビットパターンのコピーは起こる
  • ムーブとコピーの差は元の変数にアクセス可能かどうか
  • どちらの場合でも最適化されることもある (それによってビットパターンのコピーが避けられる?)

ということです。

ビットパターンのコピーはムーブ (所有権の移動) から切り離して扱うことが出来ない一体のものと考えてよいと思います。

以上のことから、少なくとも Mutex::new はその定義上からムーブは避けられませんし、ムーブすれば (運よく最適化されない限り) ビットパターンのコピーも避けられません。

投稿2023/02/08 13:18

SaitoAtsushi

総合スコア5437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問