kray_zemli (kray_zemli) wrote,
kray_zemli
kray_zemli

Сборка мусора в C++

Вроде бы как считается, что из-за ручного управления памятью C++ быстрее языков со сборщиком мусора, который может запуститься в какой-нибудь неудачный момент.

Но есть нюанс.

Представим такую систему.

1. Есть Большая Таблица в памяти, пусть для простоты это std::unordered_map с сотней миллионов записей. Таблица эта по сути сингл-тон и меняется редко.
2. Есть потоки, обрабатывающие запросы. Они используют эту таблицу. Чем быстрее поток выдаст ответ, тем лучше. Задержка с ответом весьма критична.
3. Доступ к таблице сделан так. Поток-обработчик вызывает функцию, которая получает нужные данные из таблицы. Эта функция вызывает глобальный геттер, возвращающий std::shared_ptr на таблицу, копия которого помещается в локальную переменную. Поработав с таблицей, функция вызовет деструктор своего shared_ptr и вернет результат.
4. Иногда эту таблицу нужно обновить. Для этого создаётся новая копия таблицы, и геттер будет возвращать указатель уже на неё. Когда все обращения к старой таблице закончатся (уничтожатся все shared_ptr), она автоматически освободится. Для этого геттер и возвращает именно shared_ptr, а raw pointer.

Здорово! В чём спрашивается, здесь подвох?

А подвох здесь в том, что деструктор этой структуры, из-за её объёмности, работает ужасно долго, и тот запрос, которому выпало последнему обратиться к старой таблице, подвиснет на критично большое время.

Решается проблема, конечно же, просто. Функция, обновляющая таблицу, сама создаёт копию shared_ptr, загружает новую таблицу, ждёт уменьшения счётчика до единицы, и уже потом вызывает деструктор. Тем самым она берёт удар на себя, а потоки-обработчики уже не запнутся об деструктор. Фактически, она содержит самый настоящий импровизированный сборщик мусора.

Вот такие нюансы случаются при ручном управлении памятью, тем более, когда он синхронный.
Subscribe

  • 500 тысяч школьников

    Приснилось сегодня, что за мной пришли из ФСБ (или даже из ФСО, не представились, но явно по приказу с самого верха). Задавали вопросы о моей…

  • Хохляцкий гей на передержку

    Ну что, сбылось предсказание. В армию могут до 60 забрать. Хохляцкие геи из разбомбленных борделей полезут как черти из ада на передержку…

  • Как прихлопнуть атланта

    Насчёт "Титана", отправившегося к "Титанику", гуляет теория заговора, что это было спланированное убийство "неблагоприятных" лиц. Спрашивается, зачем…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments