Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

C++. Энциклопедия пользователя - Либерти Дж.

Либерти Дж. C++. Энциклопедия пользователя — Москва, 2001. — 581 c.
Скачать (прямая ссылка): enciklopediyapolzovatelya2001.djvu
Предыдущая << 1 .. 51 52 53 54 55 56 < 57 > 58 59 60 61 62 63 .. 280 >> Следующая

Под термином поток подразумевается поток выполнения. Операционная система Windows (и большинство современных операционных систем) позволяют приложению иметь более чем один поток выполнения в одной программе. Кажется, что программа выполняет две или более задачи одновременно, хотя чаще всего компьютер переключается между потоками, обеспечивая иллюзию одновременности. Фактически именно так достигается иллюзия мультипроцессирования. Например, при выполнении программы тексто-
Использование каркасов приложении ^ 171
Глава 5 ¦ iZj
вого процессора, броузера Internet и программы электронных таблиц процессор просто переключается между ними.
Программа представляет процесс, а каждый процесс может иметь несколько потоков. Принципиальная разница между процессом и потоком заключается в том, что переключение между процессами требует больше времени, чем переключение между потоками. Вот почему на потоки иногда ссылаются как на легковесные процессы.
Контекст потока — это информация, в которой нуждается компьютер для переключения между потоками. Контекст потока состоит из стека (для временных переменных и для адресов возврата подпрограмм), стека ядра (для хранения адресов возвратов подпрограмм обслуживания прерываний) и множества регистров. В регистрах также хранятся указатель команд и указатель стека. Указатель команд сообщает процессору, где найти следующую команду, а указатель стека — где он может сохранить или получить следующую локальную переменную.
Процессор просто держит свой путь по коду. Операционная система (в данном случае Windows) сообщает процессору, когда переключать поток или процесс. Говорят, что операционная система управляет квантованием времени, позволяя каждому потоку выполняться в свой небольшой квант времени.
ПРИМЕЧАНИЕ
Многозадачность указывает на выполнение более одного вида работы одновременно. Можно сказать, что операционная система является многозадачной, если она управляет более чем одним процессом (выполняющейся программой)
одновременно. Одиночный процесс является многопоточным, когда внутри одного и того же процесса есть несколько
потоков управления.
Кооперативная многопоточность против вытесняющей
Программисты, знакомые с Windows 3.x или с Мае, возможно, сталкивались с формой многопоточности под названием кооперативная. Эта примитивная форма многопоточности позволяет выполнять более одного потока, но каждый поток должен произвольно периодически передавать управление процессору, для того чтобы предоставить возможность выполняться другим потокам.
Проблема с кооперативной многопоточностью заключается в том, что один поток может поглотить весь процессор. Тогда другие потоки будут выполняться очень медленно. Хуже того, поток может повиснуть, и тогда остановится все приложение.
Что касается вытесняющей многопоточности, то здесь учитывается способность процессора сигнализировать о том, когда пора переключаться между потоками. Этот более разумный механизм связан со взаимодействием между операционной системой (например, Windows NT) и процессором (например, Pentium), чтобы гарантировать предоставление каждому потоку предварительно установленного времени (обычно измеряемого в миллисекундах). Операционная система быстро переключается между потоками, распределяя кванты времени на основе приоритетов потоков.
Достоинство вытесняющей многопоточности заключается в том, что ни один поток не может потребить непропорциональную долю времени системы, а если поток повиснет, то оставшиеся потоки могут продолжить работу.
Проблемы вытесняющей многопоточности
Создание программ, которые выполняются в многопроцессной среде, таких как Windows, очень просто и целенаправленно: программа пишется так, будто она обладает неоспоримым доступом к процессору, жесткому диску, базе данных и т.д. Обо всем остальном должна позаботиться операционная система — вы просто идете вперед так, будто ваша программа выполняется в гордом одиночестве.
Написание многопоточного приложения более сложно. На самом деле это гораздо более сложно, поскольку ваш код неожиданно может прерываться в любое время (что всегда и происходит). Еще важнее то, что более одного потока может войти в ваш программный код так, что один и тот же код может выполняться в двух разных потоках. Такое может произойти, если каждая функция в двух разных потоках вызывает ваш код.
Многопоточные приложения могут быть обманчивыми. Если ваш код непотокобезопасен, то один поток может тщательно устанавливать значения переменных для базы данных, а другой может перекрыть те же самые значения, делая переменные бессмысленными. Это плохо и может оказаться одной из самых трудноуловимых ошибок.
124
UurijAJ. ji ptu.iujau,uu
Часть II
Для примера предположим, что есть функция, которая получает запись из базы данных, обновляет ее и записывает обратно. Ниже приведен предполагаемый программный код:
int Updater ()
{
getARecord() ; updatelt () ; writeltBack () ;
}
Предположим, что есть функция fiincl в потоке 1 и другая функция, func2, в потоке 2 и обе вызывают Updater().
Выполняется funcl() и вызывает Updater(). Updater() начинает выполняться в контексте потока 1 и получает запись. Но прежде чем запись успевает обновиться, поток прерывается и запускается поток 2.
Предыдущая << 1 .. 51 52 53 54 55 56 < 57 > 58 59 60 61 62 63 .. 280 >> Следующая