我有一个包装一些共享状态的结构
struct Demo(Arc<Mutex<State>>);
我想从生成任务的函数返回
Result
,指示状态是否已锁定或任务是否已成功生成。到目前为止我正在尝试做什么
impl Demo {
async fn start(&self) -> Result<(), Busy> {
let local_state = self.0.clone();
if let Ok(state) = local_state.try_lock() {
spawn(async move {
state.some_function().await
});
Ok(())
} else {
Err(Busy)
}
}
}
这给出了
error[E0597]: `local_state` does not live long enough
--> src/lib.rs:19:27
|
18 | let local_state = self.0.clone();
| ----------- binding `local_state` declared here
19 | if let Ok(state) = local_state.try_lock() {
| ^^^^^^^^^^^^^^^^^^^^^^
| |
| borrowed value does not live long enough
| argument requires that `local_state` is borrowed for `'static`
...
27 | }
| - `local_state` dropped here while still borrowed
这是有道理的,但我不知道如何解决它。有没有办法允许将锁定的互斥体传递给生成的任务?如果没有,允许将繁忙状态返回给调用者的最佳方法是什么?
阅读 tokio
Mutex
文档后,有一个 std 版本没有的 try_lock_owned
方法。这将返回一个用于此目的的 OwnedMutexGuard
,仅当互斥锁被包装在 Arc
中时才可用。
工作版本
impl Demo {
async fn start(&self) -> Result<(), Busy> {
let busy = self.1.read().await;
if !*busy {
}
let local_state = self.0.clone();
if let Ok(lock) = local_state.try_lock_owned() {
spawn(async move {
lock.some_function().await
});
Ok(())
} else {
Err(Busy)
}
}
}