Однопоточный сборщик мусора |
Хотя управление потоками с помощью панели управления очень полезно При разработке многопоточных программ, применение потоков в этих приложениях гораздо важнее. Оставшаяся часть главы посвящена многопоточной версии сборщика мусора из главы 2, использующего класс GCPtr. Напоминаю, что описанный в предыдущей главе сборщик мусора очищал неиспользуемую память каждый раз, когда объект типа GCPtr выходил за пределы области видимости. Хотя такой подход хорош для некоторых приложений, часто лучше запускать сборщик мусора как фоновую задачу, выполняющую очистку динамической памяти при наличии свободных циклов процессора. Реализация, предлагаемая в этой главе, разработана для операционной системы Windows, но основные технические приемы подойдут и для других систем, поддерживающих многопоточность. Преобразовать однопоточный сборщик мусора в многопоточную задачу действительно необыкновенно легко, но это потребует внесения некоторых изменений. Перечислим главные их них. 1. В класс GCPtr следует добавить переменные-члены для сопровождения потока. К их числу относятся: дескриптор потока, дескриптор мьютекса и счетчик экземпляров, который отслеживает количество существующих Объектов GCPtr. 2. Конструктор объекта GCPtr должен инициировать поток сбора мусора. Кроме того, конструктор должен создавать мьютекс, обеспечивающий синхронизацию. Это должно происходить только один раз, при создании первого объекта типа GCPtr. 3. Следует определить новое исключение для индикации превышения заданного времени ожидания. 4. Из деструктора объекта GCPtr нужно исключить вызов функции collect (), так как сбор мусора выполняется в специальном потоке. 5. Необходимо описать функцию дс(), служащую в сборщике мусора точкой входа потока. 6- Должна быть определена функция isRunningO, которая возвращает true, если выполняется сбор мусора. 7. Функции-члены класса GCPtr, обеспечивающие доступ к списку сбора мусора, следует синхронизировать так, чтобы в любой момент времени только один поток обращался к этому списку, б следующих разделах перечисленные изменения описаны подробно.
|