Я хочу, чтобы мой метод struct выполнялся синхронно. Я хотел бы сделать это с помощью Mutex
(Playground): сообщениеКак избежать проблем с заимствованием мьютексов при использовании его защиты
use std::sync::Mutex;
use std::collections::BTreeMap;
pub struct A {
map: BTreeMap<String, String>,
mutex: Mutex<()>,
}
impl A {
pub fn new() -> A {
A {
map: BTreeMap::new(),
mutex: Mutex::new(()),
}
}
}
impl A {
fn synchronized_call(&mut self) {
let mutex_guard_res = self.mutex.try_lock();
if mutex_guard_res.is_err() {
return
}
let mut _mutex_guard = mutex_guard_res.unwrap(); // safe because of check above
let mut lambda = |text: String| {
let _ = self.map.insert("hello".to_owned(),
"d".to_owned());
};
lambda("dd".to_owned());
}
}
Ошибка:
error[E0500]: closure requires unique access to `self` but `self.mutex` is already borrowed
--> <anon>:23:26
|
18 | let mutex_guard_res = self.mutex.try_lock();
| ---------- borrow occurs here
...
23 | let mut lambda = |text: String| {
| ^^^^^^^^^^^^^^ closure construction occurs here
24 | if let Some(m) = self.map.get(&text) {
| ---- borrow occurs due to use of `self` in closure
...
31 | }
| - borrow ends here
Как я понимаю, когда мы заимствуем что-нибудь от структуры мы не можем использовать поля другие структуры в до нашего заема закончен. Но как я могу выполнить синхронизацию метода?
Не могли бы вы привести [MCVE] пожалуйста? Это очень поможет! –
@LukasKalbertodt Я уже делал это :) –
Спасибо большое! Я немного отредактировал ваш ответ, надеюсь, вы не против. Я думаю, что в этой форме легче ответить. –