继续这个传奇
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对象上的互斥体,因为这是客户端和工作线程之间的共享状态。但这并不像这里抱怨的那样