我很难理解如何使用横梁双端队列实现任务调度器

问题描述

我遇到的问题是生命周期管理。我有一个注入器,我在工作线程之间共享了这个注入器。我不得不使用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 (将#修改为@)