gpt4 book ai didi

rust - 在长时间运行的Rust线程中引用self

转载 作者:行者123 更新时间:2023-12-03 11:39:31 24 4
gpt4 key购买 nike

我不知道该如何设计。基本上,我想实现一个工作池–类似于the book中的ThreadPool,但有所不同。在这本书中,它们只是传递一个闭包以使池中的线程之一可以运行。但是,我希望池中的每个线程都具有某种状态。让我解释:

use std::sync::{mpsc, Arc, Mutex};
use std::thread;

struct Job {
x: usize,
}

struct WorkerPool {
sender: mpsc::Sender<Job>,
workers: Vec<Worker>,
}

impl WorkerPool {
fn new(num_workers: usize) -> WorkerPool {
let mut workers = Vec::with_capacity(num_workers);
let (sender, receiver) = mpsc::channel();
let receiver = Arc::new(Mutex::new(receiver));

for id in 0..num_workers {
workers.push(Worker::new(id, receiver.clone()));
}

WorkerPool { sender, workers }
}
}

struct Worker {
id: usize,
thread: Option<thread::JoinHandle<()>>,
receiver: Arc<Mutex<mpsc::Receiver<Job>>>,
}

impl Worker {
fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
Worker {
id,
thread: None,
receiver,
}
}

fn start(&mut self) {
self.thread = Some(thread::spawn(move || loop {
let job = self.receiver.lock().unwrap().recv().unwrap();
self.add_to_id(job.x);
}));
}

pub fn add_to_id(&self, x: usize) {
println!("The result is: {}", self.id + x);
}
}

我的每个 Worker都获得一个ID,其工作是接受包含数字的 Job,并打印其ID和该数字(这当然是简化版本;在我的实际用例中,每个 worker 都得到一个ID。 HTTP客户端和其他一些状态)。在我看来,这是一个非常简单的问题,但显然上面的代码无法编译。

我意识到 Worker::start中的代码可能无法工作,因为当我尝试同时分配给 self时,它将 self移入了线程闭包中。

问题是,我还将如何访问线程“父”结构中的字段?

我可以以某种方式将线程关闭的生命周期限制为该结构的生命周期吗? (肯定的答案是否定的,因为闭包必须是 'static)。还是反过来,我必须在这里做所有的 'static吗?

最佳答案

不知道您要解决的确切问题。但是,您可以通过确保在线程内访问的引用在线程的整个生命周期内保持有效,来编译代码。使用id使Arc<Mutex<usize>>保持有效

显示一个使代码编译的示例:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ed750f5ba5db9597efb9b2b80bde2959

    let recv = self.receiver.clone();
let id = self.id.clone();
self.thread = Some(thread::spawn(move || loop {
let job = recv.lock().unwrap().recv().unwrap();
//self.add_to_id(job.x);
*id.lock().unwrap() = job.x;
}));

关于rust - 在长时间运行的Rust线程中引用self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62075617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com