|
Программирование >> Формирование пользовательского контейнера
Задания для самостоятельной работы Легко настроить тип GCPtr для нужд своих приложений. Как упоминалось ранее, одно изменение, которое вы, возможно, захотите сделать, - сбор мусора только после того, как некоторая заданная характеристика достигнет определенного значения, например, список gclist станет определенного размера или заданное количество указателей типа ccptr выйдет за пределы области видимости. Интересным усовершенствованием типа ccptr может стать перефузка операции new таким образом, чтобы она автоматически собирала мусор, когда возникает ошибка распределения памяти. Можно также обойтись без использования операции new при выделении памяти для объекта GCPtr, а взамен использовать функции-фабрики (factory functions), определенные классом GCPtr. Такой подход обеспечит вам тщательный контроль за динамическим распределением памяти, но сделает процесс выделения, принципиально отличным от встроенного в язык С++. Вы можете поэкспериментировать с другими решениями проблемы циклической ссылки. Один из возможных вариантов - реализация концепции слабой ссылки (weak reference), которая не препятствует сбору мусора. Вы могли бы затем использовать слабую ссылку, когда нужна циклическая. Возможно, самую интересную вариацию на тему указателя типа GCPtr вы найдете в главе 3. В ней описано создание многопоточной версии сборщика мусора, в которой сбор и очистка неиспользуемой памяти выполняются автоматически, когда у процессора есть время. Глава 3 вШшшч Многопоточность Многопоточность занимает все более важное место в современном профам-мировании. Во-первых, она позволяет создавать очень эффективные профаммы за счет наилучшего использования циклов процессора. Во-вторых, многопоточность - это естественный выбор при обработке кода, управляемого событиями, ставшего обычным в современных сильно распределенных, сетевых, основанных на интерфейсе GUI (Graphic User Inierface, Графический интерфейс пользователя) профаммных средствах. Конечно, поддержка многопоточности в наиболее широко распространенной операционной системе Windows - тоже аргумент в пользу этой технологии. Кроме того, растущая популярность многопоточности изменяет представления профаммистов об архитектуре профаммы. Хотя в языке С++ нет встроенной поддержки многопоточных приложений, он вполне подходит для решения этой задачи. Все возрастающая важность проблемы заставляет посвятить эту главу применению языка С++ для разработки двух многопоточных профамм. Первая из них - панель управления (control panel), которую вы можете использовать для контроля потоков в выполняющейся профамме. Эта задача интересна как демонстрационный пример применения многопоточности и как практическое средство, которое можно использовать при разработке многопоточных приложений. Вторая профамма, описанная в этой главе, показывает, как применять многопоточность в реальных задачах, она представляет собой Модифицированную версию сборщика мусора из главы 2, выполняющегося в фоновом потоке (background thread). этой главе также показано, насколько хорош язык С++ при непосредственном взаимодействии с операционной системой. В других языках, таких как -va, существует промежуточный слой обработки между вашей профаммой и операционной системой. Этот слой вносит потери, которые недопустимы для Некоторых профамм, например, функционирующих в среде реального времени. В противоположность таким языкам, С++ обеспечивает прямой доступ низкоуровневым функциональным средствам операционной системы и, едовательно, может создавать более производительный код. Что такое многопоточность? Сначала нужно точно определить, что означает термин многопоточность (multithreading). Многопоточность - это специализированная форма многозадачности (multitasking). В основном, выделяют два типа многозадачности: основанную на процессах (process-based) и основанную на потоках (thread-based). По сути, процесс (process) - это выполняющаяся программа. Таким образом, основанная на процессах многозадачность - средство, позволяющее вашему компьютеру выполнять несколько программ одновременно. Например, основанная на процессах многозадачность предоставляет вам возможность форматировать текст в текстовом редакторе и в то же время, например, работать с электронной таблицей или искать информацию в Интернете. В многозадачности, основанной на процессах, программа считается мельчайшей единицей кода, которой может управлять планировщик (scheduler). Лоток (thread) - это управляемая единица исполняемого кода. Название позаимствовано у концепции потока выполнения (thread of execution). В многозадачной среде, основанной на потоках, у всех процессов обязательно есть один поток, но их может быть и больше. Это означает, что в одной программе могут выполняться несколько задач одновременно. Например, текстовый редактор может форматировать текст во время печати, пока эти два действия выполняются в отдельных потоках. Отличия основанной на процессах и многопоточной многозадачности можно сформулировать следующим образом: первая поддерживает одновременное выполнение нескольких программ, а вторая имеет дело с одновременным выполнением разных фрагментов одной и той же программы. Возвращаясь к предыдущим рассуждениям, следует отметить, что истинное одновременное выполнение возможно в мультипроцессорной системе, каждый процесс или поток в которой получают неограниченное время доступа к процессору. В однопроцессорных системах, составляющих подавляющее большинство парка используемых сегодня систем, возможно только совместное выполнение (simultaneous execution). В однопроцессорной системе каждый процесс или поток получает порцию процессорного времени, величина которой определяется несколькими факторами, включая приоритет процесса или потока. Хотя на большинстве компьютеров истинно одновременное выполнение невозможно, разрабатывая программу, вы должны считать его реальностью. Это необходимо, так как вы не знаете, в каком порядке будут выполняться отдельные потоки и не повторится ли одна и та же последовательность дважды. Следовательно, лучШ программировать, предполагая, что одновременное выполнение потоков действительно существует.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |