Last active
December 13, 2023 10:28
-
-
Save ryuichiueda/a05823182d1a0c8f09fb44ceaf3ad8ad to your computer and use it in GitHub Desktop.
thread-fork test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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