在锁定互斥体之后,我不能放置一个异步函数.例2可行,而例1行得通.为什么会这样呢.我已经处理过临时工了,为什么会出问题?

let temp = Arc::new(Mutex::new(0));
tokio::spawn(async move {
        let temp = temp.lock().unwrap();
        drop(temp);
        async_func().await
    });
tokio::spawn(async move {
        async_func().await;
        let temp = temp.lock().unwrap();
        drop(temp);
    });
future cannot be sent between threads safely future created by async block is not `Send` Help: within `impl futures_util::Future<Output = ()>`, the trait `std::marker::Send` is not implemented for `std::sync::MutexGuard<'_, i32>` Note: future is not `Send` as this value is used across an await Note: required by a bound in `tokio::spawn

推荐答案

您可以使用块而不是drop.

let handle = tokio::spawn(async move {
    {
        let temp = temp.lock().unwrap();
    }
    async_func().await
});

这是一个错误(57478,87309),所以当合并97331时,drop版本将会工作.

Rust相关问答推荐

如何在Rust中实现Functor trait?

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

如果LET;使用布尔表达式链接(&Q);

替换可变引用中的字符串会泄漏内存吗?

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

如何重命名 clap_derive 中的子命令占位符?

Rust Option 的空显式泛型参数

如何限制 GtkColumnView 行数

当没有实际结果时,如何在 Rust 中强制执行错误处理?

如何在 Rust 中按 char 对字符串向量进行排序?

如何在 Rust 中将 Vec> 转换为 Vec>?

如何使用泛型满足 tokio 异步任务中的生命周期界限

如何获取函数中borrow 的切片的第一部分?

试图理解 Rust 中的可变闭包

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

是否有适当的方法在参考 1D 中转换 2D 数组

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

在 Rust 中组合特征的不同方法是否等效?

在同一向量 Rust 中用另一个字符串扩展一个字符串

如何在宏中的多个参数上编写嵌套循环?