メモリ管理を厳密に実行できるRustではスレッド間通信にmutexを使うのも現実的のように思います。おそらくchannelよりは軽量だろうと想像されるから。
https://doc.rust-jp.rs/book-ja/ch16-03-shared-state.html
を参考にchannel版からmutex版に書き換えてみます。
https://isehara-3lv.sakura.ne.jp/blog/2023/10/10/スレッド間通信でchannelを使うrust/
肝は追加されたクレートのMutexとArcになるでしょう。Rcはスレッドセーフではないので多少処理は遅くなるけれどもArcが用意されているようです。
以下のコードではchannel版をコメントアウトしてmutexに置き換えています。
use std::sync::{Mutex, Arc};
use std::thread;
use std::time::Duration;
//use std::sync::mpsc;
fn main() {
//let (tx, rx) = mpsc::channel();
let count = Arc::new(Mutex::new(0));
let mut handles = Vec::new();
for i in 0..3 {
//let thread_tx = tx.clone();
let count = Arc::clone(&count);
let handle = thread::spawn(move || {
for j in 1..10 {
println!("hi number {} {} from the spawned thread!", i, j);
thread::sleep(Duration::from_millis(1));
}
//thread_tx.send(i).unwrap();
let mut num = count.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
for handle in handles {
handle.join().unwrap();
}
//drop(tx); // without drop(), this program doesn't terminate, wait for tx forever
/*
for received in rx {
println!("Got from the threads : {}", received);
}
*/
println!("Result: {}", *count.lock().unwrap());
}
mutexで定義した変数の型は整数型ではない(VScode上では:Arc<Mutex[i32; 1]>>と表示されている)ので、unwrap()してやらないといけないのはRust特有ですが、Rustのスレッド間通信(共有)でmutexも選択肢に入りそうです。
admin