gpt4 book ai didi

rust - 仍在尝试在rust中实现C++计时器队列

转载 作者:行者123 更新时间:2023-12-03 11:45:07 32 4
gpt4 key购买 nike

more on reimplementing c++ timerqueue in rust
这段代码试图创建一个vec任务,并在另一个线程上运行它们。仍然无法编译它。我正要在随机位置随机输入单词,以查看是否有帮助,'在这里静态,在此处进行dyn sync,...。
我想,如果我看到一个有效的版本,我将能够弄清楚为什么我被困住了。但是我不能成功。
完整的代码

use std::thread;
use std::time::Instant;

fn main() {
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.thr();
}

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

struct TimerQueue {
queue: Vec<TimerQueueItem>,
}

impl TimerQueue {
fn thr(&mut self) -> () {
thread::spawn(move || {
self.runq();
});
}

fn set(&mut self, f: QIFunc, n: String, when: Instant) {
let qi = TimerQueueItem {
what: f,
name: n,
when: when,
};
self.queue.push(qi);
}
fn new() -> TimerQueue {
TimerQueue { queue: Vec::new() }
}
fn runq(&mut self) -> () {
for qi in self.queue.iter() {
(qi.what)();
}
}
}
各种各样的错误都指向同一个地方
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src\main.rs:31:23
|
31 | thread::spawn(move || {
| _______________________^
32 | | self.runq();
33 | | });
| |_________^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 30:5...
--> src\main.rs:30:5
这个似乎是专门设计来混淆的
   = note: expected `&mut TimerQueue`
found `&mut TimerQueue`

最佳答案

代替thr(&mut self),编写thr(mut self)
(mut,因为runq需要可变的引用。不过可能不需要。)
您不能仅通过引用将TimerQueue的所有权转移到新线程。当您“将”某物“移动”到闭合中时,您将所有权移交给了闭合。另一方面,如果您不移动(即将move关键字留在外面),则无法确保self的生命周期足够长。
一个C++的类比是

// BAD: v may go out of scope in the main
// thread before the new thread completes.
// Also facilitates data races.
std::vector<...> v;
std::thread([&v] () {
// use/modify v
});

// BETTER: v is moved to be "owned" by the
// closure, so it will certainly live as long as the
// thread is alive.
std::vector<...> v;
std::thread([v=std::move(v)] () mutable {
// use/modify v
})
实际上,没有像在C++中那样移动 this的成员函数之类的东西,而在Rust中有。您可以将其视为看起来像这样的静态类方法:
static void thr(TimerQueue &&tq);
// called as
TimerQueue::thr(std::move(tq));
当然,在很多方面与Rust版本并不相同,但是希望这可以帮助您了解正在发生的事情。
该错误消息肯定是无济于事的。不知道发生了什么事。

关于rust - 仍在尝试在rust中实现C++计时器队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63105895/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com