rust-lang-zh_CN/hello/src/lib.rs

80 lines
1.7 KiB
Rust
Raw Normal View History

2023-04-06 07:49:25 +08:00
use std::{
2023-04-06 09:18:44 +08:00
sync::{mpsc, Arc, Mutex},
2023-04-06 07:49:25 +08:00
thread,
};
2023-04-04 16:07:04 +08:00
2023-04-04 16:06:47 +08:00
pub struct ThreadPool {
2023-04-04 18:07:51 +08:00
workers: Vec<Worker>,
2023-04-05 21:36:53 +08:00
sender: mpsc::Sender<Job>,
2023-04-04 16:06:47 +08:00
}
2023-04-03 11:37:42 +08:00
2023-04-06 07:49:25 +08:00
type Job = Box<dyn FnOnce() + Send + 'static>;
2023-04-05 21:36:53 +08:00
2023-04-03 11:37:42 +08:00
impl ThreadPool {
2023-04-04 15:57:33 +08:00
/// 创建出一个新的 ThreadPool。
///
/// 其中的 size 为线程池中线程的数目。
///
/// # 终止运行
///
/// 这个 `new` 函数将在 size 为零时终止运行。
2023-04-03 11:37:42 +08:00
pub fn new(size: usize) -> ThreadPool {
2023-04-04 15:57:33 +08:00
assert! (size > 0);
2023-04-05 21:36:53 +08:00
let (sender, receiver) = mpsc::channel();
2023-04-06 07:49:25 +08:00
let receiver = Arc::new(Mutex::new(receiver));
2023-04-05 21:36:53 +08:00
let mut workers = Vec::with_capacity(size);
2023-04-04 16:06:47 +08:00
2023-04-05 21:36:53 +08:00
for id in 0..size {
2023-04-06 07:49:25 +08:00
workers.push(Worker::new(id, Arc::clone(&receiver)));
2023-04-04 16:06:47 +08:00
}
2023-04-05 21:36:53 +08:00
ThreadPool { workers, sender }
2023-04-03 11:37:42 +08:00
}
2023-04-03 18:03:00 +08:00
pub fn execute<F>(&self, f: F)
2023-04-06 17:20:56 +08:00
where
F: FnOnce() + Send + 'static,
2023-04-03 18:03:00 +08:00
{
2023-04-06 07:49:25 +08:00
let job = Box::new(f);
self.sender.send(job).unwrap();
2023-04-03 18:03:00 +08:00
}
2023-04-03 11:37:42 +08:00
}
2023-04-04 18:07:51 +08:00
struct Worker {
id: usize,
2023-04-06 17:20:56 +08:00
thread: Option<thread::JoinHandle<()>>,
2023-04-04 18:07:51 +08:00
}
impl Worker {
2023-04-06 07:49:25 +08:00
fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
2023-04-06 09:18:44 +08:00
let thread = thread::spawn(move || loop {
let job = receiver.lock().unwrap().recv().unwrap();
println! ("Worker {id} 获取到一项作业;执行中。");
job();
2023-04-05 21:52:27 +08:00
});
2023-04-04 18:07:51 +08:00
2023-04-06 17:20:56 +08:00
Worker {
id,
thread: Some(thread),
}
2023-04-04 18:07:51 +08:00
}
}
2023-04-06 16:40:14 +08:00
impl Drop for ThreadPool {
fn drop(&mut self) {
for worker in &mut self.workers {
println! ("关闭 worker {}", worker.id);
2023-04-06 17:20:56 +08:00
if let Some(thread) = worker.thread.take() {
thread.join().unwrap();
}
2023-04-06 16:40:14 +08:00
}
}
}