Size: a a a

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

2020 November 19

M

MrSmith in Rust — русскоговорящее сообществo
Ну хорошо, я загрузил текстовых документ, правлю область 10 строк, в думах как Сократ, остальная память не используется до конца программы
источник

M

MrSmith in Rust — русскоговорящее сообществo
Вывод: остальное утекло?
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
В твоём случае остальная память может использоваться в зависимости от действий юзера.
Я тебе привёл пример, когда остальная память не может использоваться никогда, никаких входных данных нет, а задетектить ты это всё равно не можешь.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Но да, в бытовом смысле если текстовый редактор не выгружает из памяти неиспользуемые области файла, то он течёт.
источник

M

MrSmith in Rust — русскоговорящее сообществo
Emmanuel Goldstein
В твоём случае остальная память может использоваться в зависимости от действий юзера.
Я тебе привёл пример, когда остальная память не может использоваться никогда, никаких входных данных нет, а задетектить ты это всё равно не можешь.
Дак в этом и проблема
источник

M

MrSmith in Rust — русскоговорящее сообществo
Определение зависит от наблюдателя
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Ты не можешь в общем случае определить нужна тебе память или нет.
let smth = allocate();
thread::spawn(|| {
   maybe_halts();
   now_use(smth);
});

Если функция maybe_halts() завершается, то память нужна до конца треда.
Если же, однако, она не завершается, то память можно освобождать сразу после аллокации.
Не зависит.
Вот этот пример — функция maybe_halts(); не имеет входных параметров. Она статически, на этапе компиляции, либо завершается, либо нет.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Но определить ты это не можешь.
источник

M

MrSmith in Rust — русскоговорящее сообществo
Отлично, представим, что я понятия об этом не имею. Тогда, если функция завершается я очищу память и утечки нет, однако если функция не завершается, программа впадет в цикл и остановленна может быть только пользователем и уже после произойдет очистка системой
источник

M

MrSmith in Rust — русскоговорящее сообществo
В обоих случаях утечки нет
источник

M

MrSmith in Rust — русскоговорящее сообществo
Лишние инструкции есть, ну и ладно
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
MrSmith
Отлично, представим, что я понятия об этом не имею. Тогда, если функция завершается я очищу память и утечки нет, однако если функция не завершается, программа впадет в цикл и остановленна может быть только пользователем и уже после произойдет очистка системой
Есть — у тебя программа в основном треде продолжает делать какую-то работу. Побочный тред у тебя либо циклится навечно (и тогда smth нужно освободить сразу), либо нет (и тогда smth освобождать нельзя). Главный тред делает что угодно другое.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Главный тред не может обратиться к памяти в побочном, потому что мы её туда мувнули (или исходно аллоцировали в побочном).
Побочному треду не потребуется эта память, если он зациклился.
источник

M

MrSmith in Rust — русскоговорящее сообществo
Ну хорошо, предположим, но вывод становится примерно следующим, есть ряд ситуаций неразрешимых с математической точки зрения
источник

M

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

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Ну, да, например афинные типы как в расте или линейные как в neut. Но полностью избежать утечек всё равно не выйдет.
источник

M

MrSmith in Rust — русскоговорящее сообществo
Но в данном примере проблема в том что если нет короткого пути данные должны быть сразу подготовленны к выгрузке
источник

M

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

M

MrSmith in Rust — русскоговорящее сообществo
Вообщем случае оно может быть сильно срелаксированно
источник

AZ

Alexander Zaitsev in Rust — русскоговорящее сообществo
в актиксовых акторах при передаче от одного актора сообщения к другому как можно реализовать следующее одновременно:
1) Отправить актору сообщение, не дожидаясь ответа от него
2) Если очередь на актор переполнена, то отправка должна заблокироваться до тех пор, пока очередь не освободится

1ый вариант реализуется через do_send, но он запихивает сообщение в очередь даже если она полна
2ой вариант реализуется через send, но оно ждёт ответа, а не этого не нужно.

Какие ещё есть варианты помимо вкорячевания своей очереди для общения между акторами вместо актиксовой?
источник