Size: a a a

2021 May 26

c

codingteam@cjr in codingteam
Minoru
Akon32: upgrade().unwrap() создал тебе временную переменную типа Rc<Mutex<HashMap<TaskId, TaskResultReceiver>>>, которая живёт до ближайшей точки с запятой (если её никуда не сохранить). Дальше на этой переменной вызывается lock().await, которые возвращают тебе MutexGuard<HashMap<TaskId, TaskResultReceiver>>, лайфтайм которого должен быть строго меньше лайфтайма Rc (иначе получится, что ты держишь мьютекс, находящийся внутри помершего Rc)
источник

c

codingteam@cjr in codingteam
Akon32
там Arc, точнее.
источник

c

codingteam@cjr in codingteam
Minoru
ну, не суть
источник

c

codingteam@cjr in codingteam
Minoru
теперь понятно, почему дополнительный let фиксит проблему?
источник

c

codingteam@cjr in codingteam
Akon32
а если Arc в переменную сохранять, её лайфтайм до конца блока?
источник

c

codingteam@cjr in codingteam
Akon32
идея ясна, но, когда я днём то же самое пытался сделать, не получалось.
источник

c

codingteam@cjr in codingteam
Minoru
обычно да, но ты можешь ещё до окончания блока дропнуть явно (std::mem::drop) или переместить куда-то
источник

c

codingteam@cjr in codingteam
Akon32
может, потому, что ниже я drop(arc_ws) делал..
источник

c

codingteam@cjr in codingteam
Akon32
вот если drop - то ругается, типа переменная заимствована в await.
источник

c

codingteam@cjr in codingteam
Minoru
Akon32: скорее всего, ты делал не совсем то же самое. Тут всякие тонкости могут случаться, я не могу предсказать
источник

c

codingteam@cjr in codingteam
Minoru
ну дык
источник

c

codingteam@cjr in codingteam
Minoru
ты создал Arc, залочил внутри него мьютекс
источник

c

codingteam@cjr in codingteam
Minoru
и пытаешься дропнуть Arc
источник

c

codingteam@cjr in codingteam
Minoru
что, по-твоему, при этом должно произойти с залоченным мьютексом?
источник

c

codingteam@cjr in codingteam
Akon32
хм!
источник

c

codingteam@cjr in codingteam
Akon32
надо сначала дропать мьютекс?
источник

c

codingteam@cjr in codingteam
Minoru
чтобы такого избежать, нужно сначала дропнуть MutexGuard, разлочив мьютекс, а потом уже дропать Arc
источник

c

codingteam@cjr in codingteam
Minoru
да
источник

c

codingteam@cjr in codingteam
Akon32
*MutexGuard
источник

c

codingteam@cjr in codingteam
Minoru
ну, или помещать всё это в блоки, чтобы было очевидно, что где куда
источник