|
Программирование >> Формирование пользовательского контейнера
ftMr0n0TO4HOCTb 87 влияние МНОГОПОТОЧНОСТИ на структуру программы Многопоточность изменяет базовую архитектуру программы. В отличие от однопоточной программы, которая выполняется строго последовательно, в многопоточном приложении одновременно функционируют его отдельные фрагменты или порции. Таким образом, многопоточные программы содер-зкат элемент параллельности, и их основная задача - управление взаимодействием потоков. Как обьяснялось ранее, у всех процессов есть хотя бы один поток, который называется основным (main thread). Основной поток создается в момент запуска программы. В многопоточном приложении основной поток порождает один или несколько дочерних потоков (child thread). Таким образом, многопоточный процесс запускается с одним потоком исполнения, а затем создает дополнительные потоки. В тщательно спроектированной профамме каждый поток представляет одиночный логический блок процесса. Принципиальное преимущество многопоточности состоит в том, что она позволяет вам писать очень эффективные профаммы благодаря использованию свободного времени или времени простоя, существующего в большинстве профамм. Большая часть устройств ввода/вывода, таких как сетевые порты, диски или клавиатура, гораздо медленнее процессора. Часто программа тратит подавляющую часть времени выполнения на отправку или получение данных. Разумное применение многопоточности позволит вашему приложению выполнять в это время другую задачу. Например, пока одна часть профаммы посылает файл через Интернет, другая может читать ввод с клавиатуры, а третья - записывать в буфер следующий блок данных посылаемого файла. Почему в С++ нет встроенной поддержки МНОГОПОТОЧНОСТИ? Язык С++ не содержит никакой встроенной поддержки для многопоточных приложений. Наоборот, он целиком полагается на операционную систему, обеспечивающую эту возможность. Зная, что в языки Java и С# включена Встроенная поддержка многопоточности, естественно спросить, почему же *с нет в языке С++? Эффективность, управление и диапазон приложений, в которых применяется язык С++, можно считать ответами на этот вопрос Рассмотрим каждый из них. азываясь от встроенной поддержки многопоточности, язык С++ не пы-ется найти одно универсальное решение. Вместо этого C+-i- дает вам возможность использовать функции многопоточности, предоставляемые опера-**Ионной системой. Такой подход означает, что ваши профаммы могут быть многопоточными с наибольшей степенью эффективности, обеспечиваемой исполняющей средой. Поскольку многие многозадачные системы предлагают разнообразную поддержку многопоточности, возможность ее применения становится решающей для создания высокопроизводительных многопоточных программ. Использование функций операционной системы, обеспечивающих многопоточность, предоставляет вам доступ к полному набору средств управления и контроля, предлагаемых исполняющей средой. Рассмотрим операционную систему Windows. Она определяет богатый набор относящихся к управлению потоками функций, которые делают возможным скрупулезный контроль над созданием потока и управлением им. Например, Windows обладает несколькими способами управления доступом к разделяемому или совместно используемому ресурсу (shared resource), включая семафоры (semaphores), объекты-мьютексы (mutexes), объекты-события, таймеры ожидания (waitable timers) и критические секции. Этот уровень гибкости не может быть легко встроен в язык профаммирования, потому что у операционных систем другие возможности. Следовательно, поддержка многопоточности в языке обычно означает предложение только небольшого набора общеупотребительных функциональных средств ( наименьшего общего знаменателя ). Что касается С++, то вы получаете полный доступ ко всем функциональным возможностям, обеспечиваемым операционной системой. Это существенное преимущество при разработке высокопроизюдительного кода. Язык С++ создан для профаммирования разнообразных типов задач, от встроенных систем (embedded system), в которых нет операционной системы в исполняющей среде, до сильно распределенных, базирующихся на GUI (Graphic User interface. Графический интерфейс пользователя) приложений конечного пользователя и всех промежуточных вариантов. Следовательно, С++ не может налагать существенных офаничений на исполняющую среду. Встраивание поддержки многопоточности в язык С++ сделает его пригодным только для систем, которые ее обеспечивают, и тем самым помешает использовать С++ для создания профаммного обеспечения в однопоточной среде. В заключение отмечу, что разработка программы без поддержки многопоточности - главное достоинство языка С++, позволяющее писать профаммы, наиболее эффективные для их исполняющей среды. Помните, С++ полон возможностей. В случае многопоточности девиз: меньше средств - больше возможностей оказывается как нельзя кстати. Выбор операционной системы и компилятора Поскольку язык С++ доверяет операционной системе обеспечивать поддержку многопоточности, нужно выбрать систему, которая будет исполняющей средой для многопоточных программ, создаваемых в этой главе. Обзор поточных функций в Windows Операционная система Windows предлагает широкий набор API-функций (Application Programming Interface, Интерфейс прикладного программирования), поддерживающих многопоточность. Большинство читателей знают их в той или иной мере; для тех же, кто не знаком с ними, далее представлен обзор API-функций, используемых в примерах этой главы. Помните, что Windows предлагает множество других обеспечивающих многопоточность функций, которые вы сможете применять в самостоятельной работе. Для использования API-функций, обеспечивающих многопоточность, вы должны включить в программу файл <windows.h>. Создание и завершение потока Для создания потока применяют API-функцию createThread (). Ее прототип приведен далее: HANDLE CreateThread(LPSECURITy ATTRIBUTES secAttr, SIZE T stackSize, LPTHTHREAD START ROUTINE threadFiinc, LPVOID param, DWORD flags, LPDWORD threadID); secAttr - указатель на множество параметров защиты, принадлежащих потоку. Если значение указателя secAttr равно null, то применяется дескрип-fop защиты по умолчанию (default security descriptor). каждого потока есть свой стек (stack). Вы можете задать для нового потока размер стека в байтах, используя параметр scacksize. Если его целое Остановимся на наиболее широко распространенной в мире операционной лстеме Wmdows. Однако большая часть предлагаемой читателю информации может быть использована в любой операционной системе, поддержи-ваюшей многопоточность. Так как Visual С++ - самый популярный компилятор для создания Win-(jows-программ, именно он потребуется для примеров, приведенных в этой главе. Важность этого выбора станет очевидна в следующем разделе, но если вы пользуетесь другим компилятором, приведенный код легко приспособить и к нему. Примечание Приводя примеры в этой главе, автор рассчитывает на то. что читатель обладает практическими знаниями основ программирования в среде Windows.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |