是否可以将锁定的互斥体传递给生成的任务?

问题描述 投票:0回答:1

我有一个包装一些共享状态的结构

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

这是有道理的,但我不知道如何解决它。有没有办法允许将锁定的互斥体传递给生成的任务?如果没有,允许将繁忙状态返回给调用者的最佳方法是什么?

完整的最小示例在这里

rust mutex rust-tokio
1个回答
0
投票

阅读 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)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.