我需要通过在网络接收器结构体中存储线程连接句柄来创建网络接收器线程。但是当我在start方法中创建线程时,我得到了错误error[E0506]: cannot assign to self.join_handle because it is borrowed
和error[E0521]: borrowed data escapes outside of associated function
。这是我的代码
use std::thread;
use std::sync::atomic::{AtomicBool, Ordering};
pub struct NetworkReceiver {
terminate_flag: AtomicBool,
join_handle: Option<thread::JoinHandle<()>>
}
impl NetworkReceiver {
pub fn new() -> NetworkReceiver {
let net_recv_intf = NetworkReceiver {
terminate_flag: AtomicBool::new(false),
join_handle: None
};
net_recv_intf
}
pub fn start(&mut self) {
self.join_handle = Some(thread::spawn(|| self.run()));
}
pub fn run(&mut self) {
while !self.terminate_flag.load(Ordering::Relaxed) {
}
}
pub fn terminate(&mut self) {
self.terminate_flag.store(true, Ordering::Relaxed);
}
}
3条答案
按热度按时间q5lcpyga1#
可以将
join_handle
与NetworkReceiver
中的其他内容分开,如下所示:如果你需要独占访问
NetworkReceiver
内部的任何东西,你必须把它(或需要它的部分) Package 在RwLock
或Mutex
或类似的东西里。w6lpcovy2#
当在线程中使用变量时,该线程必须拥有所有权。这一行
(thread::spawn(|| self.run());
试图将self
移动到线程中,但不能,因为self
需要比函数更长。我相信你必须将NetworkReceiver Package 在Arc Mutex中。你可以将
NetworkReceiver::new()
更改为返回Arc,所有相关函数将从fn foo(&mut self)
更改为fn foo(self: Arc<Self>)
t98cgbkg3#
我对您提供的代码做了一些更改:
我添加了一个main函数,它创建了一个NetworkReceiver的示例,并在该示例上调用start()和terminate()方法。我将run()方法设置为私有方法,因为它只能由start()方法调用。我将run()方法设置为引用自身而不是可变引用,因为它不会修改NetworkReceiver示例。