std::sync::Mutexは、同じスレッド内で2回ロックしようとするとデッドロックしてしまう。
以下のようにdropして2回ロックする方法もあるが、
let mut binding = VECT.lock().unwrap(); let objs = binding.deref_mut(); let mut flag = 0; for v in objs { // 略 } drop(binding);
そうすると、dropした後にasyc/awitを使おうとすると、axumではルーティングでエラーになってしまう。
.route(“/”, get(handle_index))
| — ^^^^^^^^^^^^ the trait `Handler<_, _>` is not implemented for fn item `fn(ConnectInfo
そのため、ロックする場合は、関数でロックして処理するようにして、一つの関数の中で2回ロックしないようにする。
別の関数で呼び出す場合は、drop(binding);とする必要はない。
fn check(name: Name) -> bool { let mut binding = VECT.lock().unwrap(); let objs = binding.deref_mut(); let mut flag = 0; for v in objs { if name.family == v.family { if name.first == v.first { if name.age == v.age { return false; } } } } return true }
なるほど〜、なんでずっとエラーになっているか理由がわかった!