Size: a a a

Rust — русскоговорящее сообществo

2020 September 30

A

Alex in Rust — русскоговорящее сообществo
Эрик
Анврапуй резалт на мутексе всегда, и всё. Он ошибку возвращает, только если предыдущий держатель мутекса запаниковал.
Именно так. Но это же не невозможно, верно?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну или юзай parking_lot::Mutex, он без пойзонинга работает.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alex
Именно так. Но это же не невозможно, верно?
Если у тебя один тред запаниковал, то ты часто и остальные хочешь дропнуть.
источник

A

Alex in Rust — русскоговорящее сообществo
И да, я обычно не анврапаю, а пишу .expect("poisoned mutex") или что-то в этом роде, т.к. от именно unwrap() в продакшен-коде меня немного коробит. Проще контролировать, что в коде ноль анврапов, чем каждый раз разбираться, какие из них "безопасные"...
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но пойзонинг спасает, если с данными в мутексе работали через unsafe и они могут быть в плохом состоянии.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Если у тебя весь код safe и ты никуда не отдаёшь мутексы, то просто анвряпай. Ну или parking_lot.
источник

A

Alex in Rust — русскоговорящее сообществo
Эрик
Но пойзонинг спасает, если с данными в мутексе работали через unsafe и они могут быть в плохом состоянии.
Ну почему обязательно ансейф. Пойзонинг в принципе полезен, если данных много, и апдейтить их нужно согласованно, не нарушая внутренних инвариантов. Если там один int - то конечно, но ведь в реально жизни это не так, мьютекс нужен как раз для атомарного обновления связанных данных.
источник

c⁣

createStore<🦉>... in Rust — русскоговорящее сообществo
Эрик
Если у тебя весь код safe и ты никуда не отдаёшь мутексы, то просто анвряпай. Ну или parking_lot.
А в асинхронном нечего анврапать, я прав?
источник

A

Alex in Rust — русскоговорящее сообществo
createStore<🦉> ⁣
А в асинхронном нечего анврапать, я прав?
Нечего, да, но не совсем понятно почему так.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alex
Ну почему обязательно ансейф. Пойзонинг в принципе полезен, если данных много, и апдейтить их нужно согласованно, не нарушая внутренних инвариантов. Если там один int - то конечно, но ведь в реально жизни это не так, мьютекс нужен как раз для атомарного обновления связанных данных.
Для этого делают

fn update_data(&mut self) {
struct PanicBomb<'a>(&'a mut Self);
impl Drop for PanicBomb<'_> { fn drop(&mut self) { self.undo_changes() } }


}
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alex
Нечего, да, но не совсем понятно почему так.
По той же причине, по которой нет пойзонинга в parking_lot — в safe коде он не нужен.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Если у тебя что-то запаниковало, у тебя баг в программе.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Если тебе так надо ловить паники, то делай

if catch_unwind(|| change_data()).is_err() {
undo_changes();
}
источник

A

Alex in Rust — русскоговорящее сообществo
Эрик
Для этого делают

fn update_data(&mut self) {
struct PanicBomb<'a>(&'a mut Self);
impl Drop for PanicBomb<'_> { fn drop(&mut self) { self.undo_changes() } }


}
хм, интересный подход, но блин, скорее экзотика. Не везде применимо, и сложнее в реализации.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alex
хм, интересный подход, но блин, скорее экзотика. Не везде применимо, и сложнее в реализации.
Ты просто ансейфа мало писал и читал. В std в куче функций такое есть.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но опять же, в safe коде оно не нужно. Если у тебя что-то запаниковало, а ты не ожидал этой паники, то у тебя баг и пора убить программу.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А в unsafe коде это делается для того, чтобы избежать UB.
источник

A

Alex in Rust — русскоговорящее сообществo
Эрик
Если у тебя что-то запаниковало, у тебя баг в программе.
Тут, в принципе, согласен.

Оговорка ровно одна: иногда хотят получить очень стабильное приложение, которое не падает даже при наличии багов в программе. Какой-нибудь критичный сервер, который перезапускается строго под контролем, а не падает когда ему вздумается. Но вообще да, это тема спорная, насколько можно доверять данным, которые будут крутиться в забагованной программе. Нов реальной жизни я встречал такое требование часто.
источник

A

Alex in Rust — русскоговорящее сообществo
Эрик
Ты просто ансейфа мало писал и читал. В std в куче функций такое есть.
Согласен, мало. И слава тнб (:
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alex
Тут, в принципе, согласен.

Оговорка ровно одна: иногда хотят получить очень стабильное приложение, которое не падает даже при наличии багов в программе. Какой-нибудь критичный сервер, который перезапускается строго под контролем, а не падает когда ему вздумается. Но вообще да, это тема спорная, насколько можно доверять данным, которые будут крутиться в забагованной программе. Нов реальной жизни я встречал такое требование часто.
Так спавни треды из ядра без паник и лови паники в join.
источник