再议 Send,Sync

本文讨论了 Rust 中遇到的 Send 和 Sync 特质的问题,源于尝试在异步上下文中调用某个不满足 Send 约束的函数。错误提示表明未来的值未实现 Send,因为其在 await 点被使用。理解关键在于:如果 &T 是 Send 的,那么 T 必须是 Sync。为解决此问题,需要确保相关类型满足 Sync 要求,通过修改类型转换代码来适应并发环境。问题不仅限于此,结构体内部包含不满足 Sync 的字段时,同样会引发问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题起因


想要通过 trait object 调用 Trait 中定义的 async method(s) (async fn 通过 async-trait 模拟实现)

示例代码如下

use async_std::task;
use async_trait::async_trait;

#[async_trait]
trait Foo {
   
    async fn foo(&self);
}

struct A;

#[async_trait]
impl Foo for A {
   
    async fn foo(&self) {
   
        println!("foo A")
    }
}

fn main() {
   
    task::block_on(async {
   
        task::spawn(async {
   
            let a = A;
            // 直接通过 A 调用 foo 没有问题
            a.foo().await;
            let o = &a as &dyn Foo;
            // 通过 trait object 编译错误如下
            o
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值