问题描述
我遇到的问题是生命周期管理。我有一个注入器,我在工作线程之间共享了这个注入器。我不得不使用Arc<>
,因为&
会引起终身投诉。本地队列不共享,因此不必担心。然后我们来看看抢劫犯。
在文档中,窃取可以在线程之间共享。因此,每个线程有一个工人的4个线程最终导致每个线程有3个窃贼。但是,再次遇到生命周期问题,似乎在生成线程时指向self
的移动。任务选择器示例表明,盗窃者可以表示为一部分盗窃者,而我最终得到的是对盗窃者的引用。
也许我误解了文档,应该使用Arc
样式的引用计数来管理注入器和窃取器的寿命。有人可以帮我澄清一下吗?
这是一个简化的(带有3个线程的池)。我已经删除了线程的窃取程序和注入程序周围的生命周期管理,因为它们可能是Arc
或<'a>
或其他。
// details on injector,worker and stealer can be found here:
// https://docs.rs/crossbeam/0.7.3/crossbeam/deque/index.html
struct ThreadData {
injector: &deque::Injector::<Task>,// common global queue
task_q: deque::Worker::<Task>,// local queue
stealers: Vec<&deque::Stealer<Task>> // stealers for other threads local queue
}
impl ThreadData {
fn spawn(self) -> Option<std::thread::JoinHandle<()>> {
let thread = std::thread::spawn(move|| {
find_task( &self.task_q,&self.injector,&self.stealers);
});
Some(thread)
}
}
struct Worker {
stealer: deque::Stealer<Task>,// to be shared with other threads
thread: Option<std::thread::JoinHandle<()>>
}
struct Factory {
injector: deque::Injector::<Task>,// owner of the global queue
workers: Vec<Worker>
}
impl Factory {
fn new() -> Self {
Self { injector: deque::Injector::<Task>::new(),workers: Vec::new() }
}
fn build_threadpool(mut self) {
let mut t1 = ThreadData {
injector: &self.injector,task_q: deque::Worker::<Task>::new_fifo(),stealers: Vec::new(),};
let w1 = Worker {stealer: t1.task_q.stealer(),thread: None };
let t2 = ThreadData {
injector: &self.injector,};
let w2 = Worker {stealer: t2.task_q.stealer(),thread: None};
let t3 = ThreadData {
injector: &self.injector,};
let w3 = Worker {stealer: t3.task_q.stealer(),thread: None };
t1.stealers.push(&w2.stealer);
t1.stealers.push(&w3.stealer);
t2.stealers.push(&w1.stealer);
t2.stealers.push(&w3.stealer);
t3.stealers.push(&w1.stealer);
t3.stealers.push(&w2.stealer);
// launch threads and save workers
w1.thread = t1.spawn();
w2.thread = t2.spawn();
w3.thread = t3.spawn();
self.workers.push(w1);
self.workers.push(w2);
self.workers.push(w3);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)