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);
}
1
共 6 条评论, 1 页
评论区
写评论那我还不如用条件编译
--
👇
Easonzero: 如果想大部分代码不变的情况下, 切换是否启用异步运行时, 那么建议使用有栈协程(例如 may), 而非rust社区推崇的无栈协程
--
👇
shanliu: 有没有兼容方案, 假如我没用TOKIO运行时
--
👇
zwk1234: use tokio::sync::Mutex;
如果想大部分代码不变的情况下, 切换是否启用异步运行时, 那么建议使用有栈协程(例如 may), 而非rust社区推崇的无栈协程
--
👇
shanliu: 有没有兼容方案, 假如我没用TOKIO运行时
--
👇
zwk1234: use tokio::sync::Mutex;
有没有兼容方案, 假如我没用TOKIO运行时
--
👇
zwk1234: use tokio::sync::Mutex;
内部可变的代替呢? 不加锁,有没代替方法?
--
👇
我心飞翔: 用 tokio::sync::Mutex 替换 use std::sync::Mutex
用 tokio::sync::Mutex 替换 use std::sync::Mutex
use tokio::sync::Mutex;