Поиск

Очистка объектов и управление ресурсами

Возможность обеспечивать очистку и освобождение ресурсов после завершения исполнения компонентов — одна из самых важных функций системы на основе компонентов. Под "очисткой и освобождением ресурсов" я понимаю своевременное освобождение ссылок на другие компоненты и освобождение ресурсов, количество которых невелико или ограничено, за которые идет конкуренция (например, соединения с базой данных, описатели файлов и коммуникационные порты). Под "завершением" я понимаю тот момент, когда объект более не используется. В C++ очистку осуществляет деструктор (destructor) объекта — определенная для каждого объекта C++ функция, автоматически выполняемая при выходе объекта из области видимости. В мире Microsoft .NET очистку объектов автоматически производит .NET Garbage Collector (GC). В силу некоторых причин эта стратегия противоречива, поскольку в отличие от предсказуемости C++ исполнение кода завершения объекта в решениях .NET основано на модели с отложенными вычислениями ("lazy" model). GC использует фоновые потоки, определяющие, что ссылок на объект больше не осталось. Другие потоки GC в свою очередь отвечают за исполнение кода завершения данного объекта. Чаще всего это то, что нужно, но это далеко не оптимальное решение, когда мы имеем дело с ресурсами, которые необходимо своевременно освобождать в предсказуемом порядке. И решить эту проблему ой как нелегко. В этом разделе я опишу проблемы, связанные с завершением объектов и управлением ресурсами, и расскажу, в чем заключается ваша роль в создании объектов с предсказуемым сроком жизни. [Этот раздел в значительной степени построен на основе замечательного разъяснения управления ресурсами в С#, которое сделал в открытом сетевом форуме Брайан Гэрри (Brian Harry), член команды разработчиков Microsoft .NET. Я хочу поблагодарить его за разрешение на использование сделанного им разъяснения.]