- •Архитектуры и модели программ и знаний
- •параллельного и распределенного программирования
- •Потоки: история
- •Введение
- •Поддержка потоков в .NET
- •Архитектура процесса .NET
- •Области приложений
- •Определение AppDomains
- •Свойства областей
- •Область действия типов и
- •Области приложений и изоляция
- •Обработка областей приложений
- •Загрузка приложения в AppDomain
- •Области приложений и выстраивание
- •Создание и запуск потока
- •Управление классом Thread
- •Управление потоками
- •Локальная память потока
- •Прерывание и прекращение потоков
- •Безопасное управление потоками
- •Синхронизированный контекст
- •Синхронизированные регионы кода
- •Синхронизация “вручную”
- •Синхронизация и классы .NET
- •Класс Timer
- •Пул потоков (ThreadPool)
- •Асинхронное
- •Шаблон проектирования
- •Пример асинхронного чтения файла
- •Пример асинхронного чтения файла
- •Асинхронные делегаты
- •Технологии параллельного
- •Классы для отладки и
- •Программная модель
- •Управление
- •Использование TraceSwitch
- •Настройка
- •Настройка TraceSwitch
- •Сравнение с Java
- •Вопросы и домашнее задание к лекции 21
Области приложений и изоляция
Области приложений обеспечивают защиту от отказов в рамках процесса ОС
Каждая область имеет свои собственные
Фильтр необработанных исключений
Набор полномочий “на вершине стека”
Области приложений независимо компилируются и отлаживаются
Граница области приложения для объектов закрыта
(C)Сафонов В.О. 2012
Обработка областей приложений
Области приложений могут создаваться, обрабатываться и удаляться программным путем
CreateDomain создает новую область в процессе ОС
Unload останавливает исполнение области приложений и освобождает все ресурсы, которые она использует
ExecuteAssembly исполняет сборку в заданной области приложения
CreateInstance создает экземпляр объекта в
заданной области приложения
DoCallback вызывает функцию-делегат в заданной области приложений
Load загружает сборку в заданную область приложения
(C)Сафонов В.О. 2012
Загрузка приложения в AppDomain
using System;
public class App
{
public static int Main (string[] args)
{
AppDomain child = AppDomain.CreateDomain (“child”, null,null);
return child.ExecuteAssembly(“child.exe”, null, null);
}
}
(C) Сафонов В.О. 2012
Области приложений и выстраивание
Передача ссылок через границы областей приложений требует выстраивания (marshaling)
Оно выполняется явно при запросе свойств области
Может быть выполнено “вручную” с помощью RemotingServices.Marshal
Типы, унаследованные от
System.MarshalByRefObject, ограничены пределами области приложения
Объект, класс которого имеет атрибут [Serializable], не имеет таких ограничений и может быть передан по значению
Остальные типы не могут использовать выстраивание
(C)Сафонов В.О. 2012
Создание и запуск потока
Создание нового экземпляра класса ThreadКонструктор имеет единственный
параметр
Делегат ThreadStart
Делегат ThreadStart содержат ссылку на метод, который должен исполнить данный поток (“функцию потока”)
Запуск потока выполняется методом StartСравните: В Java поток имеет метод run(), который играет роль функции потока.
Запуск выполняется методом start()
Thread |
t = |
new Thread |
(new |
ThreadStart(MyThread.ThreadProc)); |
|
t.Start(); |
|
|
|
|
(C) Сафонов В.О. 2012 |
Управление классом Thread
Присваивание потоку имени
Свойство Thread.Name
Управление его приоритетом
Свойство Thread.Priority
Проектирование потока
Свойство Thread.IsBackground
Основные и фоновые потоки
t.Name = "My Background Thread"; t.Priority = ThreadPriority.AboveNormal; t.IsBackground = true;
(C) Сафонов В.О. 2012
Управление потоками |
Вызов Thread.Sleep приводит к |
блокировке потока |
Thread.Sleep(3000); // blocks for 3 seconds |
Методы Suspend и Resume должны использоваться с |
осторожностью |
Они могут привести к тупикам (deadlocks) |
Вызов Thread.Join приводит к ожиданию завершения |
заданного потока. |
Сравните: Авторы Java были вынуждены объявить |
методы Suspend и Resume “не рекомендуемыми” |
(“deprecated”) в более поздних версиях Java из-за |
t.Start(); |
t.Join(); // Wait for the thread to exit |
WaitHandle.WaitAll(waitEvents); |
(C) Сафонов В.О. 2012 |
Локальная память потока
Локальная память потока – это слот данных, имеющийся в каждом потоке
Статические поля данныхКонструктор вызывается только для первого
потокаСтатические поля остальных потоков
инициализируются нулями
class ClassWithThreadState
{
[ThreadStatic] public static int count = 1;
public void ThreadMethod() { count++;
}
}
(C) Сафонов В.О. 2012
Прерывание и прекращение потоков
Метод Thread.Interrupt
“Будит” поток и генерирует в нем
ThreadInterruptedException
Метод Thread.Abort пытается прервать поток
“Будит” поток и генерирует в нем
ThreadAbortException
Исключение генерируется заново в конце блока catch до ResetAbort
Нет абсолютной гарантии
прекращения потока
Для этой цели используйте Thread.Join
(C) Сафонов В.О. 2012
Безопасное управление потоками
Проблема совместного использования ресурсов
потоками
Race condition – неуправляемый порядок
доступа к общим ресурсам
Тупик – циклический список потоков, ждущих
друг друга
Лучше избежать одновременного доступа
Каждый элемент имеет свою собственную
копию данных
Стратегии синхронизации (доступа к данным экземпляра и статическим полям)
Синхронизированный контекст
Синхронизированный блок кода
Ручная синхронизация
(C)Сафонов В.О. 2012
