use nix::unistd::{fork, getpid, getppid, ForkResult}; use std::thread; use std::time::Duration; fn main() { thread::spawn(|| { for i in 1..10 { println!("hi number {} from the spawned thread!", i); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!("hi number {} from the main thread!", i); thread::sleep(Duration::from_millis(1)); } }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.75s
Running `target/debug/parallel`
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the spawned thread!
hi number 3 from the main thread!
hi number 4 from the spawned thread!
hi number 4 from the main thread!
hi number 5 from the spawned thread!
joinを呼び出すことで、実行されたことを保証する
fn main() { let handle = thread::spawn(|| { for i in 1..5 { println!("hi number {} from the spawned thread!", i); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!("hi number {} from the main thread!", i); thread::sleep(Duration::from_millis(1)); } handle.join().unwrap(); }
所有権の移転
fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(move|| { for i in 0..3 { println!("hi number {} from the spawned thread!", v[i]); thread::sleep(Duration::from_millis(1)); } }); for i in 1..3 { println!("hi number {} from the main thread!", i); thread::sleep(Duration::from_millis(1)); } handle.join().unwrap(); }
なんか違うような気がするが…
use nix::unistd::{fork, getpid, getppid, ForkResult}; use std::thread; use std::time::Duration; use rayon::current_num_threads; fn cpu_waster(i: u32) { let name = gettid::gettid().to_string(); println!("{} doing {} work", name, i); thread::sleep(Duration::from_millis(5)); } fn display_threads() { let str: String = "-".to_string(); println!("{}", str.repeat(10)); println!("Current process PID: {}", getpid()); println!("Thread Count: {}", current_num_threads()); } fn main() { let num_threads = 5; display_threads(); println!("Starting {} CPU waters...", num_threads); let handle = thread::spawn(move|| { for i in 0..num_threads { cpu_waster(i); } }); display_threads(); handle.join().unwrap(); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.23s
Running `target/debug/parallel`
———-
Current process PID: 582557
Thread Count: 2
Starting 5 CPU waters…
———-
Current process PID: 582557
Thread Count: 2
582600 doing 0 work
582600 doing 1 work
582600 doing 2 work
582600 doing 3 work
582600 doing 4 work