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
}
なるほど〜、なんでずっとエラーになっているか理由がわかった!