The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Выпуск языка программирования Rust 1.54"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Заметили полезную информацию ? Пожалуйста добавьте в FAQ на WIKI.
. "Выпуск языка программирования Rust 1.54" +/
Сообщение от Anonnnym (?), 30-Июл-21, 15:06 
>> управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора
> lockfree без GC, или при чем тут упоминание параллелизма?

Судя по дискуссии, меня не совсем правильно поняли. Я не говорил о GC таком как в Java, C# или D, который прибирает за пользователем всю выделенную память. Я говорил о GC для lockfree структур.

Изначально процитированная часть (не полная) говорит о том, что в rast высокая скорость выполнения параллельных заданий достигается без использования GC и runtime. Тут я предположил 2 вещи о которых может вестись речь: выделение/освобождение памяти и lockfree структуры. Для первого сообщение в новости исключает кастомные аллокаторы, а без них мы не можем выделить памяти без блокировок, так как ходим в ядро. По этому я и спросил только про lockfree, т.к. мне не совсем понятно как можно организовать lockfree-структуру без сборщика мусора.

На пример возьмем односвязный список с 2мя полями - value и next, где next - указатель на следующий элемент, а value - значение, которое нам в примере неинтересно.

Для добавления элемента в список нам нужно создать его - записав значение и nullptr в next, после чего указатель на наш элемент надо добавить в конец списка, для этого через CAS сравниваем и заменяем nullptr поля next последнего элемента списка на указатель на наш новый элемент. Т.к. пока мы искали последний элемент списка он мог перестать быть последним, данная операция выполняется в бесконечном цикле.

Для удаления можно попробовать поступить так же, но если мы после удаления элемента из списка (замена указателя на него nullptr), удалим сам элемент (вызовем delete), то мы можем уронить приложение обращением к освобожденной памяти, из-за того, что другой поток обратился к элементу перед удалением, а прочитал поле из него уже после удаления.

По этому для удаления элементов нужен сборщик мусора, который когда-нибудь таки дернит блокировку и по удаляет элементы (вызовет delete).

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка программирования Rust 1.54, opennews, 29-Июл-21, 22:11  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру