Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Основы организации потоков. Потоки и многозадачность. Пространство имен System.Threading. Класс Thread. Создание потока.

Читайте также:
  1. FAB-классификация острых лейкозов
  2. I. Классификации осужденных по УИК РФ
  3. I. Основы жестикуляции
  4. I. Теоретические и практические основы проведения актуарных расчетов в Испании.
  5. II. КЛАССНАЯ ДАМА
  6. II. ОРГАНИЗАЦИЯ И ФУНКЦИОНИРОВАНИЕ КЛАССОВ КОРРЕКЦИОННО-РАЗВИВАЮЩЕГО ОБУЧЕНИЯ
  7. II. Типологии характера, их классификация
  8. II. Формальные нормативы классического идеала.
  9. II. ЦЕЛИ, ЗАДАЧИ И НАПРАВЛЕНИЯ ДЕЯТЕЛЬНОСТИ ОРГАНИЗАЦИИ.
  10. II.3. На классическом материале или на современном?

Cреди множества новых средств С# самым значительным, пожалуй, является встроенная поддержка многопоточного программирования (multithreaded programming) и асинхронного программирования. Приложение.NET состоит из одного или нескольких процессов. Процессу принадлежит выделенная для него область памяти и ресурсы, такие как внешние библиотеки программного кода, первичный поток. Каждый процесс может состоять из нескольких доменов (частей) приложения, ресурсы которых изолированы друг от друга. Домен приложения представляет собой обособленный логический раздел процесса, куда помещается выполняемый файл.NET (.exe). В рамках домена может быть запущено несколько потоков выполнения. Поток (thread) — это управляемая единица выполняемого кода. Иногда этот термин переводится буквально – «нить», чтобы отличить его от потоков ввода/вывода. Все процессы имеют, по крайней мере, один поток управления, который обычно называется основным (main thread) или первичным, поскольку именно с этого потока начинается выполнение программы. Из основного можно создать и другие потоки. Управление потоками осуществляет операционная система.

Таким образом, многопоточность представляет собой специальную форму многозадачности. Многопоточное программирование опирается на сочетание средств, предусмотренных языком С#, и классов, определенных в среде.NET Framework, т.е. поддержка многопоточности встроена в язык. В многозадачной среде, ориентированной на потоки, все процессы имеют, по крайней мере, один поток, но возможно и большее их количество. Это означает, что одна программа может выполнять сразу две и более задач. Например, текстовый редактор может форматировать текст и в то же время выводить что-либо на печать, поскольку эти два действия выполняются двумя отдельными потоками.

Преимущество многопоточности состоит в том, что она позволяет разрабатывать очень эффективные программы, поскольку предоставляет возможность с толком использовать вынужденное время ожидания (простоя), которое имеет место во многих программах. Общеизвестно, что большинство устройств ввода-вывода (сетевые порты, дисководы или клавиатура) работают гораздо медленнее, чем центральный процессор (ЦП). Поэтому в программах львиная доля времени выполнения зачастую тратится на ожидание окончания отправки информации устройству (или получения от него). Используя многопоточность, можно построить программу так, чтобы она в такие периоды ожидания выполняла другую задачу. Например, пока одна часть программы будет отправлять файл по электронной почте, другая ее часть может считывать входные данные с клавиатуры, а еще одна — буферизировать следующий блок данных для отправки в Internet.

Поток может находиться в одном из нескольких возможных состояний. Он может выполняться. Он может быть готовым к выполнению (как только получит время ЦП).

Выполняющийся поток может быть приостановлен, т.е. его выполнение временно прекращается. Позже оно может быть возобновлено. Поток может быть заблокирован в ожидании необходимого ресурса. Наконец, поток может завершиться, и уж в этом случае его выполнение окончено и продолжению (возобновлению) не подлежит.

В среде.NET Framework определено два типа потоков: высокоприоритетный (foreground) и низкоприоритетный, или фоновый (background). По умолчанию поток создается высокоприоритетным, но его тип можно изменить, т.е. сделать его фоновым. Единственное различие между высоко- и низкоприоритетным потоками состоит в том, что последний будет автоматически завершен, если все высокоприоритетные потоки в его процессе остановились.

Существуют также и недостатки многопоточного программирования:

– большое количество потоков ведет к увеличению накладных расходов, связанных с их переключением, что снижает общую производительность системы;

– в многопоточных приложениях возникают проблемы синхронизации данных, связанные с потенциальной возможностью доступа к одним и тем же данным со стороны нескольких потоков.

Иногда издержки, связанные с созданием и диспетчеризацией потоков, могут привести к тому, что однопоточное приложение работает быстрее. Все зависит от того, что вы делаете и действительно ли вы можете распределить выполнение независимых задач между потоками. Например, если вам надо считать с диска три файла, создание для этого трех потоков не принесет вам пользы, поскольку все они будут обращаться к одному и тому же жесткому диску. Поэтому всегда старайтесь протестировать оба прототипа — однопоточную и многопоточную версию своей системы, прежде чем тратить время и средства на разработку решения, которое может быть неоправданно с точки зрения производительности. Небольшие преимущества, которые дает использование нескольких потоков, просто не стоят времени, потраченного на реализацию многопоточности.


 

Использование нескольких потоков. Планирование потоков, приоритеты потоков.

Приоритет потоков. Класс Thead поддерживает установку и получение приоритета потока. Для этого использ перечисление ThreadPriority. Его значения:

Highest Наивысший приоритет

Above Normal Приоритет выше обычного (Normal)

Normal Приоритет по умолчанию

Below Normal Приоритет ниже обычного

LowestСамый низкий приоритет

В большинстве случаев следует использовать приоритет по умолчанию (Normal).Повышение или понижение приоритета может привести к тому, что ОС придется выделить некоторым потокам гораздо больше (или меньше) ресурсов, чем ожидалось. А если назначить некоторому потоку наивысший приоритет, остальные операции в системе могут просто остановиться. Порой повышать и понижать приоритет приходится, но делайте это с осторожностью. Надолго повысив приоритет одного потока, вы вряд ли сможете повысить производительность системы в целом, т. к. при этом возникнет нехватка ресурсов у др потоков, что может привести к непредсказуемым результатам.

Часто в многопоточной программе нужно позаботиться о том, чтобы основной поток завершался последним. Формально программа продолжает выполн до тех пор, пока не завершатся все высокоприоритет потоки. Т. обр., совсем необязательно завершение основного потока последним. Однако добиваться этого — один из признаков хорошего стиля программирования, поскольку в этом случае ясно определяется конечная точка программы.

Использование нескольких потоков. Можно создавать в программе несколько дочерних потоков.

Задание: Выполнить одну операцию в нескольких потоках.

Создать статический метод SimpleWork() в классе MultiThread (перед методом Main), который выводит на экран Id-номер каждого потока:

class MultiThread

{ static void SimpleWork()

{ Console.WriteLine("Thread: " + Thread. CurrentThread. ManagedThreadId); }

static void Main(string[] args)

{ ThreadStart operation = new ThreadStart(SimpleWork);

for (int x = 1; x <= 5; ++x)

{ // Создаем новый поток, но не запускаем его

Thread theThread = new Thread(operation);

// Запускаем задачу в новом потоке




Дата добавления: 2015-09-10; просмотров: 113 | Поможем написать вашу работу | Нарушение авторских прав

Классы библиотеки .NET для работы с потоками | Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream. | Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader. | Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader. | Краткий обзор ADO.NET. Три стороны технологии ADO.NET. Пространство имен System.Data. | Поставщики данных ADO.NET. Поведение объектов подключения. | Объектная модель ADO.NET | Краткий обзор объектов ADO .NET. | События | Свойства |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав