use crate::thread_pool::core::ThreadManager;
use crate::Join;
use std::thread::JoinHandle;
impl Join for JoinHandle<()> {
fn join(self) -> std::thread::Result<()> {
self.join()
}
}
pub struct UnscopedThreadManager();
impl Default for UnscopedThreadManager {
fn default() -> Self {
Self::new()
}
}
impl UnscopedThreadManager {
pub fn new() -> Self {
Self()
}
}
impl ThreadManager<'static> for UnscopedThreadManager {
type Handle = JoinHandle<()>;
fn spawn_thread<F: FnOnce() + Send + 'static>(&self, func: F) -> Self::Handle {
std::thread::spawn(func)
}
}
#[cfg(test)]
mod tests {
use crate::thread_pool::{ThreadPool, UnscopedThreadManager};
fn fibonacci_recursive(n: usize) -> usize {
if n == 0 {
0
} else if n == 1 {
1
} else {
fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
}
}
#[test]
fn basic() {
const N: usize = 50;
let manager = UnscopedThreadManager::new();
let mut pool: ThreadPool<UnscopedThreadManager, usize> = ThreadPool::new(4);
for _ in 0..N {
pool.send(&manager, |_| fibonacci_recursive(20));
}
assert!(!pool.is_idle());
pool.wait().unwrap();
assert!(pool.is_idle());
let mut tasks = 0;
while let Some(event) = pool.poll() {
assert_eq!(event, 6765);
tasks += 1;
}
assert_eq!(tasks, N);
}
#[test]
fn reduce() {
const N: usize = 50;
let manager = UnscopedThreadManager::new();
let mut pool: ThreadPool<UnscopedThreadManager, usize> = ThreadPool::new(4);
for _ in 0..N {
pool.send(&manager, |_| fibonacci_recursive(20));
}
assert!(!pool.is_idle());
let tasks = pool.reduce().count();
assert_eq!(tasks, N);
assert!(pool.is_idle());
}
}