Skip to content

Instantly share code, notes, and snippets.

@ryuichiueda
Last active December 13, 2023 10:28
Show Gist options
  • Save ryuichiueda/a05823182d1a0c8f09fb44ceaf3ad8ad to your computer and use it in GitHub Desktop.
Save ryuichiueda/a05823182d1a0c8f09fb44ceaf3ad8ad to your computer and use it in GitHub Desktop.
thread-fork test
use std::{time, thread};
use std::sync::{Arc, Mutex};
use std::time::Instant;
use nix::unistd;
use nix::unistd::ForkResult; //懺悔:これいらなかったです(cargo buildするとワーニング出ます。削ってください。)
fn main() {
let s = Arc::new(Mutex::new(String::new())); //Arcの中のMutexの中の文字列がデータ本体です。
let s1 = s.clone();
/* サブのスレッド: 5秒間ロックを持ったままにしたあとwittenと書き込む */
thread::spawn(move || {
let mut s = s1.lock().unwrap();
thread::sleep(time::Duration::from_secs(5));
s.push_str("written");
}); //ロック外れる
//これ以後はメインのスレッドの処理ですね
let t = Instant::now(); //時間の計測のためのコードです
/* フォークして親子が1秒ごとに文字列を読む試みをする */
match unsafe{unistd::fork()} {
Ok(child_or_parent) => { //親も子もここにくる
let s2 = s.clone();
loop {
thread::sleep(time::Duration::from_secs(1));
let s = s2.lock().unwrap(); //ロックの取得
println!("{}秒後 {:?}: {:?}", t.elapsed().as_secs(), child_or_parent, s);
} //ロック外れる
},
Err(_) => panic!("!"),
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment