代码之家  ›  专栏  ›  技术社区  ›  pm100

在rust中重新实现c++timerqueue

  •  0
  • pm100  · 技术社区  · 4 年前

    继续这个传奇 recoding a c++ task queue in rust. Is futures the right abstraction?

    我已经学会了如何将函数调用存储在向量中(现在我忽略了所有的集合、排序等)。让我们把一些请求放入一个集合中,让它们在另一个线程上运行。

    所以我有

    pub struct TimerQueueItem {
        when: Instant,
        name: String,
        what: QIFunc,
    }
    type QIFunc = Box<dyn Fn() -> ()>;
    
    struct TimerQueue {
        queue: Vec<TimerQueueItem>,
    }
    

    我可以把这些放在一个向量中,然后在向量上循环并调用它们。

    let x = || {
        println!("hello");
    };
    let y = || {
        println!("hello2");
    };
    
    let mut tq = TimerQueue::new();
    tq.set(Box::new(x), String::from("yo"), Instant::now());
    tq.set(Box::new(y), String::from("yo"), Instant::now());
    
    tq.runq();
    

    一切正常。但是,当我尝试在不同的线程上运行队列时,我被告知我无法在线程之间移动那些QIFunc。

    fn thr(&mut self)->Sender<i32>{
    
        let (tx, rx) = channel::<i32>();
        thread::spawn(move ||{
                rx.recv();
                self.runq();
        });
        tx
    
    }
    

    给予

    41  |         thread::spawn(move ||{
        |         ^^^^^^^^^^^^^ `(dyn std::ops::Fn() + 'static)` cannot be sent between threads safely
    

    现在我可以随机尝试各种各样的东西,但我正在努力让我的大脑理解这一切,并将其映射到我从c++中获得的概念。我已经觉得自己接近了“魔法咒语”的境界,在那里我剪切粘贴了我不理解的咒语,但它们似乎奏效了。所以,欢迎给我一些我应该读的东西的建议。我读了很多书。我想这只是一个陡峭的学习曲线。

    感觉我需要TimerQueue对象上的互斥体,因为这是客户端和工作线程之间的共享状态。但这并不像这里抱怨的那样

    0 回复  |  直到 4 年前