(2,3) – осуществляются ядром операционной системы (планировщиком)
(4) – продолжение работы невозможно
§ Для продолжения работы требуется наступление какого-либо события
§ Поток затребовал недоступный в данный момент ресурс
§ Поток переводится в состояние ожидания ядром операционной системы во время обработки системного вызова
§ Поток заблокирован внешним по отношению к нему вызовом
(5) – проводится ядром ОС в момент выполнения условия ожидания.
Постановка задачи планирования
Потокам для выполнения нужен ЦП
Если потоков боле, чем процессор
Вытесняющие алгоритмы планирования….
Выбирают поток и позволяют ему работать некоторое максимально возможное фиксированное время. Если к концу заданного интервала времени поток все еще работает, он приостанавливается, и управление переходит к другому потоку (если существует поток, готовый к исполнению).
Недостатки многопоточного программирования
Велики накладные расходы
§ На создание и обслуживание потока ОС требуется память и время
|
|
§ Создание и уничтожение потока – это достаточно дорогие операции, поэтому излишнее увлечение много поточностью может привести к потере эффективности работы
Реализация многопоточного приложения требует усложнения алгоритма
Классы, поддерживавшие многопоточное программирование, определены в пространстве имен System.Threading
Основной класс пространства имен – класс Thread
Имя | Описание |
Sleep() | Приостанавливает текущий поток на заданное время |
IsAlive | Возвращает True, если поток запущен |
IsBackground | True, если поток – «фоновый» |
Join() | Блокирует вызывающий поток до тех пор, пока указанный поток (тот,, для которого вызван Join()) не завершится |
Start() | Инструктирует CLR запустить поток как можно скорее |
Два типа потоков
Потоки переднего плана (приоритетные)
Данный тип обеспечивают предохранение текущего приложения от завершения – среда CLR не остановит приложение до тех пор, пока не будут завершены все приоритетные потоки.