1use core::hash::Hasher;
2use core::time::Duration;
3use std::hash::RandomState;
4use std::sync::Mutex;
5
6use job_pool::{PoolConfig, ThreadPool};
7
8pub fn main() {
9 let conf = PoolConfig::builder().max_jobs(16).build();
10 let pool = ThreadPool::new(conf).unwrap();
11
12 let nums = (0..1000).collect::<Vec<_>>();
13
14 let n = Mutex::new(0);
15
16 fn delay() {
17 use core::hash::BuildHasher;
18 let rand = RandomState::new().build_hasher().finish();
19 let millis = rand % 500;
20 std::thread::sleep(Duration::from_millis(1000 + millis));
21 }
22
23 pool.scope(|scope| {
24 scope.subscope(|sc| {
25 sc.execute(|| {
26 delay();
27 *n.lock().unwrap() += nums.iter().sum::<usize>();
28 println!("Sum1");
29 });
30 sc.execute(|| {
31 delay();
32 *n.lock().unwrap() += nums.iter().filter(|n| *n % 2 == 0).sum::<usize>();
33 println!("Sum even");
34 });
35 });
36
37 scope.subscope(|sc| {
38 sc.execute(|| {
39 delay();
40 *n.lock().unwrap() *= nums.iter().max().unwrap();
41 println!("Mul max");
42 });
43
44 sc.execute(|| {
45 delay();
46 *n.lock().unwrap() *= nums[nums.len() / 2];
47 println!("Mul mid");
48 });
49 });
50 });
51
52 let mut expected = 0;
53 expected += nums.iter().sum::<usize>();
54 expected += nums.iter().filter(|n| *n % 2 == 0).sum::<usize>();
55 expected *= nums.iter().max().unwrap();
56 expected *= nums[nums.len() / 2];
57
58 let n = *n.lock().unwrap();
59 assert_eq!(n, expected);
60 println!("{n} == {expected}");
61}