- •Архитектуры и модели программ и знаний
- •параллельного и распределенного программирования
- •Потоки: история
- •Введение
- •Поддержка потоков в .NET
- •Архитектура процесса .NET
- •Области приложений
- •Определение AppDomains
- •Свойства областей
- •Область действия типов и
- •Области приложений и изоляция
- •Обработка областей приложений
- •Загрузка приложения в AppDomain
- •Области приложений и выстраивание
- •Создание и запуск потока
- •Управление классом Thread
- •Управление потоками
- •Локальная память потока
- •Прерывание и прекращение потоков
- •Безопасное управление потоками
- •Синхронизированный контекст
- •Синхронизированные регионы кода
- •Синхронизация “вручную”
- •Синхронизация и классы .NET
- •Класс Timer
- •Пул потоков (ThreadPool)
- •Асинхронное
- •Шаблон проектирования
- •Пример асинхронного чтения файла
- •Пример асинхронного чтения файла
- •Асинхронные делегаты
- •Технологии параллельного
- •Классы для отладки и
- •Программная модель
- •Управление
- •Использование TraceSwitch
- •Настройка
- •Настройка TraceSwitch
- •Сравнение с Java
- •Вопросы и домашнее задание к лекции 21
Синхронизированный контекст |
|
Атрибут SynchronizationAttribute для класса, |
|
унаследованного от ContextBoundObject |
|
|
Синхронизированные методы и данные |
|
экземпляра |
|
Статические методы и данные не |
|
синхронизированы |
[Synchronization] |
|
class CounterSynchronizedContext : ContextBoundObject |
|
{ |
|
static int sCount = 0; // multiple threads can access |
|
int iCount = 0; // only one thread can access at a time |
|
public void Increment() { |
|
//… only one thread can access at a time |
|
} |
|
} |
|
|
(C) Сафонов В.О. 2012 |
Синхронизированные регионы кода |
|
Атрибут MethodImplAttribute с параметром |
|
MethodImplOptions.Synchronized |
|
[MethodImplAttribute(MethodImplOptions.Synchronized)] |
|
|
Гарантирует вызов только из одного потока |
|
Для статических методов и методов |
|
экземпляра |
Аналогичен использованию lock для всего |
|
|
метода |
Класс Monitor синхронизированный |
|
доступ к фрагменту кода |
|
|
Monitor.Enter, Monitor.TryEnter и Monitor.Exit |
|
Использование ключевого слова lock языка C# |
|
lock(this) для защиты экземпляра |
|
lock(typeof(class)) для защиты класса |
|
lock (typeof(Counter)) { |
|
// block of protected code |
|
} |
|
(C) Сафонов В.О. 2012 |
Синхронизация “вручную”
Класс Interlocked для синхронизации атомарного доступа
CompareExchange, Decrement,
Exchange, Increment
Управление данными в совместно используемой памяти
Класс Mutex синхронизация процессов
ReaderWriterLock –
синхронизированный доступ для записи
Проблема “один писатель / много читателей”
(C) Сафонов В.О. 2012
Синхронизация и классы .NET
Framework
Public static – элементы класса МП- безопасны
Остальные: см. документацию
Коллекции по умолчанию не МП- безопасны
HashTable МП-безопасна только для схемы “один писатель / много читателей”
Для получения МП-безопасной коллекции:
Класс-обертка, содержащий методы синхронизации
Использование механизма lock
Сравните: В Java есть synchronized –
методы и операторы (механизм lock в C# очень сходен с ними)
(C) Сафонов В.О. 2012
Класс Timer
Класс Thread.Timer для периодического исполнения заданного кода
Основан на делегате
Threading.TimerCallback
Метод Change изменяет временной интервал
Метод Dispose освобождает ресурсы
Timer timer = new Timer(
new TimerCallback(CheckStatus), null, 0, 1000); // …
static void CheckStatus(Object state) { Console.WriteLine("Checking Status.");
}
(C) Сафонов В.О. 2012
Пул потоков (ThreadPool)
Используется для повышения эффективности
Класс ThreadPool
Метод QueueUserWorkItem
Делегат WaitCallback
Построен на базе платформы Win32
Не рекомендуется использовать пул потоков,
если:
Необходимо управлять приоритетами
Вероятно длительное исполнение
Необходимо поместить потоки в STA (Single-
Threaded Apartment)
Делегат IOCompletionCallback сигнализирует об успешном завершении
Поток обрабатывает полученные данные
Сравните: В Java введен класс ThreadGroup,
как способ сделать многопоточность более
структурированной
(C)Сафонов В.О. 2012
Асинхронное
программирование
Поддержка различными частями
.NET
I/O, сокеты, работа в сети, remoting, ASP.NET, Web-сервисы, обработка сообщений (MSMQ), делегаты
Шаблон проектирования
Унифицированная и безопасная программная модель
Классы, создаваемые пользователем, должны следовать данному шаблону
(C)Сафонов В.О. 2012
Шаблон проектирования
Вызывающий метод принимает решение о типе вызова:
Поддерживаемый серверомИли делегат в клиентской части
Вызывающий метод выполняет декомпозицию операции вызоваНачало вызова: передача параметров, затем старт
вызова
Интерфейс IAsyncResult используется для возврата
Когда операция завершена – получение результата
Несколько способов определения факта завершения операции
Callback–метод, вызываемый по завершении операции
Периодический опрос
IAsyncResult.IsCompleted
Вызов метода завершения – фактически возврат к синхронной модели вызова
Ожидание тайм-аута в свойстве
IAsyncResult.WaitHandle
(C) Сафонов В.О. 2012
Пример асинхронного чтения файла
Использование callback-механизма |
Создание callback |
AsyncCallback myCallback = new |
AsyncCallback(this.OnReadDone); |
Запуск операции |
IAsyncResult ar = aStream.BeginRead(buffer, 0, buffer.Length, myCallback, (object)myState);
Получение результата с помощью callback
int byteCount = aStream.EndRead(ar); // data in buffer |
(C) Сафонов В.О. 2012 |
Пример асинхронного чтения файла
Периодический опрос
Запуск операции
IAsyncResult ar = |
aStream.BeginRead(buffer,0, |
buffer.Length, |
null,(object)myState); |
while (!ar.IsCompleted) |
{ |
// do whatever |
} |
int byteCount = aStream.EndRead(ar); // data in buffer |
(C) Сафонов В.О. 2012
