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

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

我遇到的问题是生命周期管理。我有一个注入器,我在工作线程之间共享了这个注入器。我不得不使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?