< 返回版块

github.com/shanliu/lsys 发表于 2022-07-06 15:48

use std::sync::{Arc, Mutex};

struct A {
    a: i32,
}

impl A {
    async fn aa(&mut self) -> i16 {
        self.a = 1;
        1
    }
}

struct B {
    a: Arc<Mutex<A>>, //需求要 Arc Mutex
}
#[tokio::main]
//#[allow(clippy::await_holding_lock)]
async fn main() {
    let b = B {
        //前置条件 a需要Arc且需要可变
        a: Arc::new(Mutex::new(A { a: 0 })),
    };
    if 11 > 10 {
        //某些条件成立时变更
        *b.a.lock().unwrap() = A { a: 1 };
    }

    //锁定后 await 会有警告,该如何优化????
    let a = b.a.lock().unwrap().aa().await;
    println!("{}", a);
}

不加锁情况

use std::cell::RefCell;
struct A {
    a: i32,
}

impl A {
    async fn aa(&mut self) -> i16 {
        self.a = 1;
        1
    }
}

struct B1 {
    a: RefCell<A>, //需求要 Arc Mutex
}

#[tokio::main]
async fn main() {
    let b = B1 {
        //前置条件 a需要Arc且需要可变
        a: RefCell::new(A { a: 0 }),
    };

    if 11 > 10 {
        //某些条件成立时变更
        *b.a.borrow_mut() = A { a: 1 }
    }

    //锁定后 await 会有警告,该如何优化????
    let a = b.a.borrow_mut().aa().await;
    println!("{:?}", a);
}

评论区

写评论
作者 github.com/shanliu/lsys 2022-07-08 23:30

那我还不如用条件编译

--
👇
Easonzero: 如果想大部分代码不变的情况下, 切换是否启用异步运行时, 那么建议使用有栈协程(例如 may), 而非rust社区推崇的无栈协程

--
👇
shanliu: 有没有兼容方案, 假如我没用TOKIO运行时

--
👇
zwk1234: use tokio::sync::Mutex;

Easonzero 2022-07-08 21:26

如果想大部分代码不变的情况下, 切换是否启用异步运行时, 那么建议使用有栈协程(例如 may), 而非rust社区推崇的无栈协程

--
👇
shanliu: 有没有兼容方案, 假如我没用TOKIO运行时

--
👇
zwk1234: use tokio::sync::Mutex;

作者 github.com/shanliu/lsys 2022-07-06 18:27

有没有兼容方案, 假如我没用TOKIO运行时

--
👇
zwk1234: use tokio::sync::Mutex;

作者 github.com/shanliu/lsys 2022-07-06 18:26

内部可变的代替呢? 不加锁,有没代替方法?

--
👇
我心飞翔: 用 tokio::sync::Mutex 替换 use std::sync::Mutex

我心飞翔 2022-07-06 17:06

用 tokio::sync::Mutex 替换 use std::sync::Mutex

zwk1234 2022-07-06 16:40

use tokio::sync::Mutex;

1 共 6 条评论, 1 页