Rustの "future cannot be sent between threads safely" エラーについて
RustとtokioでMutexを利用した非同期コードを書いていたところ,以下のようなエラーが出てしまいました.
Mutexがdropされていないことによるエラーだと考え明示的にdropしたのですがやはり同じエラーが出てしまいます.
このエラーの出る理由と,このエラーを回避する方法を教えていただけると嬉しいです.
初めての質問ですので至らぬ点があるかとは思いますがよろしくお願いいたします.
発生している問題・エラーメッセージ
future cannot be sent between threads safely future created by async block is not `Send` help: within `impl std::future::Future`, the trait `std::marker::Send` is not implemented for `std::sync::MutexGuard<'_, i32>`rustc main.rs(1, 1): required by a bound in this main.rs(92, 22): future created by async block is not `Send` main.rs(102, 13): has type `std::sync::MutexGuard<'_, i32>` which is not `Send` main.rs(105, 19): await occurs here, with `mut a` maybe used later main.rs(112, 5): `mut a` is later dropped here spawn.rs(127, 21): required by this bound in `tokio::spawn`
エラーの再現コード
rust
1use std::sync::{Arc, Mutex}; 2 3#[tokio::test] 4async fn async_test() { 5 let handle = tokio::spawn(async move { 6 let a = Arc::new(Mutex::new(0)); 7 let ret = funcA(&a).await; 8 println!("ret: {}, a: {}", ret, a.lock().unwrap()); 9 }); 10 11 handle.await; 12} 13 14async fn funcA(this: &Arc<Mutex<i32>>) -> i32 { 15 let mut a = this.lock().unwrap(); 16 *a += 1; 17 18 let ret = funcB(this).await; 19 20 println!("funcA: {}",a); 21 22 drop(a); 23 24 ret 25} 26 27pub async fn funcB(this: &Arc<Mutex<i32>>) -> i32 { 28 let mut a = this.lock().unwrap(); 29 *a += 2; 30 31 println!("funcB: {}",a); 32 33 drop(a); 34 35 100 36}
補足情報
rustc: version 1.54.0
tokio: version 1.11.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/09/11 08:59