SlideShare a Scribd company logo
1 of 29
1
©LuxoftTraining2012
PostSharp Threading Pattern Library
Андрей Гордиенков
my@violet-tape.net
softblog.violet-tape.ru
2
Обо мне
 Фанат программирования и рассказов о программировании
 Ведет свой блог 5+ года: статьи и видео
 АОП евангелист
 Очень ленив, поэтому ищет пути как писать меньше, а делать больше
3
Немного из истории языков
 Ранние языки строилась вокруг модели памяти
 Оперирование переменными, а не адресами памяти
 FORTRAN I (1955)
 Дальнейшее развитие пошло вокруг модели исполнения
 Внедрение методов и подпрограмм
 FORTRAN II (1958)
 Внедрение областей видимости
 ALGOL 60
 Объединение концепций
 COBOL
 Скорее всего первый ООП язык был SIMULA
 C++, C# и Java прямые наследники SIMULA
4
Качества хорошей модели программирования
 Адекватные абстракции
 Проверяемость
 Локальность и разделение ответственности
 Детерминизм
 Производительность
5
Threading Pattern Library
 Предоставляет высокоуровневый механизм управления моделями
многопоточности для кода.
 Проверка времени компиляции и исполнения.
 Присутствует в PostSharp Express.
 Реализованные модели:
 Immutable
 Freezable
 Synchronized
 Reader/Writer Synchronized
 Actor
 Thread Affine
 Thread Unsafe
6
Необходимые условия работы моделей
 Для корректной работы может потребоваться использование специальных
коллекций
 AdvisableCollection<T>
 AdvisableDictionary<TKey,TValue>
 Поддержка концепции агрегации и композиции фреймворком.
 [Child]
 [Parent]
 [Reference]
7
Пример
[Aggregatable]
public class Invoice {
[Child]
public readonly AdvisableCollection<InvoiceLine> Lines = new AdvisableCollection<InvoiceLine>();
[Reference]
public Customer Customer;
}
[Aggregatable]
public class InvoiceLine {
[Reference]
public Product Product;
[Parent]
public Invoice ParentInvoice { get; private set; }
}
8
Ключевые идеи PostSharp TPL
 Основной фокус направлен на познавательные аспекты программирования
 Понятия Immutable, Actor, Freezable, Locking могут относиться к многопоточности
 Модели многопоточности относятся к классам, а не к приложению и модулям
 Разные модели многопоточности могут сосуществовать в одном приложении
 Шаблоны проектирования могут быть реализованы расширением языка, а не
кучей кода
 Можно точно определить, что есть валидный код на уровне классов. Исключая
инвариантность.
 Использование агрегации/композиции как основы для формализации шаблонов
9
Immutable
Суть: Объект не может быть изменен после того, как выполнилась вся цепочка
конструкторов.
 Подход в целом неадекватен для ООП.
 Инициализация объекта часто продолжается после создания объекта.
 Никак не регулируется изменяемость объектов принадлежащих классу.
 Фиксирование объекта происходит после выполнения последнего
конструктора в цепочке.
 Изменятся могут только поля/свойства помеченные [Reference]
10
Пример
[Immutable]
public class Invoice {
public long Id { get; set; }
public Invoice(long id) {
Id = id;
Items = new AdvisableCollection<Item>();
Items.Add(new Item("widget"));
}
[Child]
public AdvisableCollection<Item> Items { get; set; }
}
11
Freezable
Суть: Перед обработкой объекта в других потоках, его надо «заморозить».
Операция не обратимая.
 Рабочая модель для идеи «неизменяемых» объектов. В реализации
руководствовались следующим:
 Доступ к объекту запрещен для других потоков, пока объект не был заморожен. Даже на
чтение.
 После «заморозки» объект не может быть изменен ни при каких обстоятельствах.
 Метод Freeze() замораживает также все агрегируемые свойства
 «Дети» должны реализовывать модель Immutable или Freezable
12
Freezable
 Применение аспекта внедряет в класс интерфейс IFreezable
public interface IFreezable : IThreadAware {
void Freeze();
}
13
Пример
[Freezable]
public class Invoice {
[Child]
public readonly AdvisableCollection<InvoiceLine> Lines = new AdvisableCollection<InvoiceLine>();
[Reference]
public Customer Customer;
}
[Freezable]
public class InvoiceLine {
[Reference]
public Product Product;
[Parent]
public Invoice ParentInvoice { get; private set; }
}
14
Synchronized
Суть: Критические секции класса оборачиваются конструкцией lock(), которая
позволяет обрабатывать (читать/писать) себя только одному потоку
одновременно.
 «Классика жанра», самая популярная модель доступа к данным в
многопоточной среде.
 Главный подозреваемый при организации deadlock и задержке потоков.
 Падение производительности происходит при работе с долгими операциями вводавывода
 Реализация основана на классе Monitor
15
Пример
[Synchronized]
public class OrderService {
public void Process(int sequence) {
Console.WriteLine("sequence {0}", sequence);
Console.WriteLine("sleeping for 10s");
Thread.Sleep(new TimeSpan(0, 0, 10));
}
}
16
Reader-Writer Synchronized
Суть: Раздельные уровни блокировки частей кода для чтения и для записи. В
один момент времени чтение позволено многим потокам, запись – только
одному.
 Public и Internal методы класса должны быть помечены атрибутами:
 [Reader]
 [Writer]
 [UpgradableReader]
 Get/Set автоматически помечаются как [Reader]/[Writer]
 Реализация основана на ReaderWriterLockSlim классе
17
Пример
[ReaderWriterSynchronized]
public class Order {
public decimal Amount { get; set; }
public decimal Discount { get; set; }
[Child]
public AdvisableCollection<Item> lines = new AdvisableCollection<Item>();
public decimal AmountAfterDiscount {
get { return Amount - Discount; }
}
[Writer]
public void Set(decimal amount, decimal discount) {
if (amount < discount) {
throw new InvalidOperationException();
}
Amount = amount;
Discount = discount;
}
}
18
Actor
Суть: Запросы класса асинхронно перенаправляются в одну очередь исполнения
в которой выполняются по порядку в один поток.
 Любой public/internal метод упаковывается в сообщение, которое кладется в
очередь
 Класс реализует интерфейс IActor
 Реализация основана на классе ConcurrentQueue
 Шаблон требует, чтобы все методы относились к следующим категориям:
 Ничего не возвращали в результате работы
 Были асинхронными. Помечены словом async
public interface IActor : IThreadAware
{
IActorDispatcher Dispatcher { get; }
}
19
Пример
[Actor]
public class AverageCalculator {
private float sum;
private int count;
public void AddSample(float n) {
count++;
sum += n;
}
[Reentrant]
public async Task<float> GetAverage() {
return sum / count;
}
}
20
Thread Affine
Суть: Методы класса выполняется только в том потоке, в котором был создан
класс.
 Реализация просто запоминает поток создания объекта.
 Никаких особенностей =)
21
Пример
[ThreadAffine]
public class OrderService {
public void Process(int sequence) {
Console.WriteLine("sequence {0}", sequence);
Console.WriteLine("sleeping for 10s");
Thread.Sleep(new TimeSpan(0, 0, 10));
}
}
22
Thread Unsafe
Суть: При одновременном доступе к классу с нескольких потоков, выбрасывается
исключение.
 Не рекомендуется к использованию.
 Существует только для диагностики проблем многопоточности.
 Вызывает исключение, если смена значения происходит в другом потоке.
 Реализовано с помощью операции CompareExchange
23
Пример
[ThreadUnsafe]
internal class AverageCalculator {
private float sum;
private int count;
public void AddSample(float n) {
count++;
sum += n;
}
public float GetAverage() {
return sum / count;
}
}
24
Особенности использования
 Синхронные методы возвращающие результат должны быть помечены
атрибутом [ExplicitlySynchronized]
 Для таких методов/свойств просто не будет производится проверка
 Если точка входа в класс – приватный метод, то его надо обозначить
атрибутом [EntryPoint]
 Например, через делегат к приватному методу.
25
Ограничения при использовании
 Ограниченная проверка на этапе сборки
 PostSharp проверяет структурную композицию, а не поведение элементов
 Блокирующее ожидание в async методах
 Все async методы должны быть помечены атрибутом [Reentrant]
 Нет асинхронного ожидания
 Нет защиты хоста
 Не проводились тесты на наличие исключений OutOfMemoryException или
ThreadAbortException в процессе работы.
26
Написание своей валидации
 Фактически любой базовый аспект позволяет переопределить самостоятельно
метод CompileTimeValidate() для валидации на этапе компиляции
[Serializable]
public class MethodAttribute : OnMethodBoundaryAspect {
public override bool CompileTimeValidate(MethodBase method) {
}
}
[Serializable]
public class TypeAspect : TypeLevelAspect {
public override bool CompileTimeValidate(Type type) {
}
}
27
Вопросы
28
Ссылки
 Github https://github.com/VioletTape/PS_TPL_Examples
 PostSharp http://www.postsharp.net
29
©LuxoftTraining2012
Спасибо!
my@violet-tape.net
softblog.violet-tape.ru

More Related Content

What's hot

Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.Igor Shkulipa
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикIT61
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.Igor Shkulipa
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.Igor Shkulipa
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.Igor Shkulipa
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.Igor Shkulipa
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьYauheni Akhotnikau
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.Igor Shkulipa
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 

What's hot (20)

Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.C++ STL & Qt. Занятие 07.
C++ STL & Qt. Занятие 07.
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная часть
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.
 
Обзор SObjectizer 5.5
Обзор SObjectizer 5.5Обзор SObjectizer 5.5
Обзор SObjectizer 5.5
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 

Viewers also liked

Corporate Identity for the library
Corporate Identity for the libraryCorporate Identity for the library
Corporate Identity for the libraryIrina Baryshnikova
 
Multi Team Architecture
Multi Team ArchitectureMulti Team Architecture
Multi Team ArchitectureSigma Software
 
Mind Your Business. And Its Logic
Mind Your Business. And Its LogicMind Your Business. And Its Logic
Mind Your Business. And Its LogicVladik Khononov
 
Creating a Plug-In Architecture
Creating a Plug-In ArchitectureCreating a Plug-In Architecture
Creating a Plug-In Architectureondrejbalas
 
Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)Chinmoy Mohanty
 
Enterprise Software Architecture styles
Enterprise Software Architecture stylesEnterprise Software Architecture styles
Enterprise Software Architecture stylesAraf Karsh Hamid
 
How ddd, cqrs and event sourcing constitute the architecture of the future
How ddd, cqrs and event sourcing constitute the architecture of the futureHow ddd, cqrs and event sourcing constitute the architecture of the future
How ddd, cqrs and event sourcing constitute the architecture of the futureMSDEVMTL
 
CQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDDCQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDDDennis Doomen
 
Что такое аналитика в маркетинге, зачем она нужна, и как ее готовить
Что такое аналитика в маркетинге, зачем она нужна, и как ее готовитьЧто такое аналитика в маркетинге, зачем она нужна, и как ее готовить
Что такое аналитика в маркетинге, зачем она нужна, и как ее готовитьMindbox
 

Viewers also liked (10)

Corporate Identity for the library
Corporate Identity for the libraryCorporate Identity for the library
Corporate Identity for the library
 
Excel
ExcelExcel
Excel
 
Multi Team Architecture
Multi Team ArchitectureMulti Team Architecture
Multi Team Architecture
 
Mind Your Business. And Its Logic
Mind Your Business. And Its LogicMind Your Business. And Its Logic
Mind Your Business. And Its Logic
 
Creating a Plug-In Architecture
Creating a Plug-In ArchitectureCreating a Plug-In Architecture
Creating a Plug-In Architecture
 
Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)Plugin architecture (Extensible Application Architecture)
Plugin architecture (Extensible Application Architecture)
 
Enterprise Software Architecture styles
Enterprise Software Architecture stylesEnterprise Software Architecture styles
Enterprise Software Architecture styles
 
How ddd, cqrs and event sourcing constitute the architecture of the future
How ddd, cqrs and event sourcing constitute the architecture of the futureHow ddd, cqrs and event sourcing constitute the architecture of the future
How ddd, cqrs and event sourcing constitute the architecture of the future
 
CQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDDCQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDD
 
Что такое аналитика в маркетинге, зачем она нужна, и как ее готовить
Что такое аналитика в маркетинге, зачем она нужна, и как ее готовитьЧто такое аналитика в маркетинге, зачем она нужна, и как ее готовить
Что такое аналитика в маркетинге, зачем она нужна, и как ее готовить
 

Similar to PostSharp - Threading Model Library

C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.Igor Shkulipa
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftAnton Loginov
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)Andrey Gordienkov
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAndrey Gordienkov
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...DevDay
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011etyumentcev
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняLuxoftTraining
 
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...Vadim Ponomarev
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в MagentoPavel Usachev
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsSergey Schetinin
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeSQALab
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentationsef2009
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpGoSharp
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 

Similar to PostSharp - Threading Model Library (20)

C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровня
 
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocols
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 

PostSharp - Threading Model Library

  • 1. 1 ©LuxoftTraining2012 PostSharp Threading Pattern Library Андрей Гордиенков my@violet-tape.net softblog.violet-tape.ru
  • 2. 2 Обо мне  Фанат программирования и рассказов о программировании  Ведет свой блог 5+ года: статьи и видео  АОП евангелист  Очень ленив, поэтому ищет пути как писать меньше, а делать больше
  • 3. 3 Немного из истории языков  Ранние языки строилась вокруг модели памяти  Оперирование переменными, а не адресами памяти  FORTRAN I (1955)  Дальнейшее развитие пошло вокруг модели исполнения  Внедрение методов и подпрограмм  FORTRAN II (1958)  Внедрение областей видимости  ALGOL 60  Объединение концепций  COBOL  Скорее всего первый ООП язык был SIMULA  C++, C# и Java прямые наследники SIMULA
  • 4. 4 Качества хорошей модели программирования  Адекватные абстракции  Проверяемость  Локальность и разделение ответственности  Детерминизм  Производительность
  • 5. 5 Threading Pattern Library  Предоставляет высокоуровневый механизм управления моделями многопоточности для кода.  Проверка времени компиляции и исполнения.  Присутствует в PostSharp Express.  Реализованные модели:  Immutable  Freezable  Synchronized  Reader/Writer Synchronized  Actor  Thread Affine  Thread Unsafe
  • 6. 6 Необходимые условия работы моделей  Для корректной работы может потребоваться использование специальных коллекций  AdvisableCollection<T>  AdvisableDictionary<TKey,TValue>  Поддержка концепции агрегации и композиции фреймворком.  [Child]  [Parent]  [Reference]
  • 7. 7 Пример [Aggregatable] public class Invoice { [Child] public readonly AdvisableCollection<InvoiceLine> Lines = new AdvisableCollection<InvoiceLine>(); [Reference] public Customer Customer; } [Aggregatable] public class InvoiceLine { [Reference] public Product Product; [Parent] public Invoice ParentInvoice { get; private set; } }
  • 8. 8 Ключевые идеи PostSharp TPL  Основной фокус направлен на познавательные аспекты программирования  Понятия Immutable, Actor, Freezable, Locking могут относиться к многопоточности  Модели многопоточности относятся к классам, а не к приложению и модулям  Разные модели многопоточности могут сосуществовать в одном приложении  Шаблоны проектирования могут быть реализованы расширением языка, а не кучей кода  Можно точно определить, что есть валидный код на уровне классов. Исключая инвариантность.  Использование агрегации/композиции как основы для формализации шаблонов
  • 9. 9 Immutable Суть: Объект не может быть изменен после того, как выполнилась вся цепочка конструкторов.  Подход в целом неадекватен для ООП.  Инициализация объекта часто продолжается после создания объекта.  Никак не регулируется изменяемость объектов принадлежащих классу.  Фиксирование объекта происходит после выполнения последнего конструктора в цепочке.  Изменятся могут только поля/свойства помеченные [Reference]
  • 10. 10 Пример [Immutable] public class Invoice { public long Id { get; set; } public Invoice(long id) { Id = id; Items = new AdvisableCollection<Item>(); Items.Add(new Item("widget")); } [Child] public AdvisableCollection<Item> Items { get; set; } }
  • 11. 11 Freezable Суть: Перед обработкой объекта в других потоках, его надо «заморозить». Операция не обратимая.  Рабочая модель для идеи «неизменяемых» объектов. В реализации руководствовались следующим:  Доступ к объекту запрещен для других потоков, пока объект не был заморожен. Даже на чтение.  После «заморозки» объект не может быть изменен ни при каких обстоятельствах.  Метод Freeze() замораживает также все агрегируемые свойства  «Дети» должны реализовывать модель Immutable или Freezable
  • 12. 12 Freezable  Применение аспекта внедряет в класс интерфейс IFreezable public interface IFreezable : IThreadAware { void Freeze(); }
  • 13. 13 Пример [Freezable] public class Invoice { [Child] public readonly AdvisableCollection<InvoiceLine> Lines = new AdvisableCollection<InvoiceLine>(); [Reference] public Customer Customer; } [Freezable] public class InvoiceLine { [Reference] public Product Product; [Parent] public Invoice ParentInvoice { get; private set; } }
  • 14. 14 Synchronized Суть: Критические секции класса оборачиваются конструкцией lock(), которая позволяет обрабатывать (читать/писать) себя только одному потоку одновременно.  «Классика жанра», самая популярная модель доступа к данным в многопоточной среде.  Главный подозреваемый при организации deadlock и задержке потоков.  Падение производительности происходит при работе с долгими операциями вводавывода  Реализация основана на классе Monitor
  • 15. 15 Пример [Synchronized] public class OrderService { public void Process(int sequence) { Console.WriteLine("sequence {0}", sequence); Console.WriteLine("sleeping for 10s"); Thread.Sleep(new TimeSpan(0, 0, 10)); } }
  • 16. 16 Reader-Writer Synchronized Суть: Раздельные уровни блокировки частей кода для чтения и для записи. В один момент времени чтение позволено многим потокам, запись – только одному.  Public и Internal методы класса должны быть помечены атрибутами:  [Reader]  [Writer]  [UpgradableReader]  Get/Set автоматически помечаются как [Reader]/[Writer]  Реализация основана на ReaderWriterLockSlim классе
  • 17. 17 Пример [ReaderWriterSynchronized] public class Order { public decimal Amount { get; set; } public decimal Discount { get; set; } [Child] public AdvisableCollection<Item> lines = new AdvisableCollection<Item>(); public decimal AmountAfterDiscount { get { return Amount - Discount; } } [Writer] public void Set(decimal amount, decimal discount) { if (amount < discount) { throw new InvalidOperationException(); } Amount = amount; Discount = discount; } }
  • 18. 18 Actor Суть: Запросы класса асинхронно перенаправляются в одну очередь исполнения в которой выполняются по порядку в один поток.  Любой public/internal метод упаковывается в сообщение, которое кладется в очередь  Класс реализует интерфейс IActor  Реализация основана на классе ConcurrentQueue  Шаблон требует, чтобы все методы относились к следующим категориям:  Ничего не возвращали в результате работы  Были асинхронными. Помечены словом async public interface IActor : IThreadAware { IActorDispatcher Dispatcher { get; } }
  • 19. 19 Пример [Actor] public class AverageCalculator { private float sum; private int count; public void AddSample(float n) { count++; sum += n; } [Reentrant] public async Task<float> GetAverage() { return sum / count; } }
  • 20. 20 Thread Affine Суть: Методы класса выполняется только в том потоке, в котором был создан класс.  Реализация просто запоминает поток создания объекта.  Никаких особенностей =)
  • 21. 21 Пример [ThreadAffine] public class OrderService { public void Process(int sequence) { Console.WriteLine("sequence {0}", sequence); Console.WriteLine("sleeping for 10s"); Thread.Sleep(new TimeSpan(0, 0, 10)); } }
  • 22. 22 Thread Unsafe Суть: При одновременном доступе к классу с нескольких потоков, выбрасывается исключение.  Не рекомендуется к использованию.  Существует только для диагностики проблем многопоточности.  Вызывает исключение, если смена значения происходит в другом потоке.  Реализовано с помощью операции CompareExchange
  • 23. 23 Пример [ThreadUnsafe] internal class AverageCalculator { private float sum; private int count; public void AddSample(float n) { count++; sum += n; } public float GetAverage() { return sum / count; } }
  • 24. 24 Особенности использования  Синхронные методы возвращающие результат должны быть помечены атрибутом [ExplicitlySynchronized]  Для таких методов/свойств просто не будет производится проверка  Если точка входа в класс – приватный метод, то его надо обозначить атрибутом [EntryPoint]  Например, через делегат к приватному методу.
  • 25. 25 Ограничения при использовании  Ограниченная проверка на этапе сборки  PostSharp проверяет структурную композицию, а не поведение элементов  Блокирующее ожидание в async методах  Все async методы должны быть помечены атрибутом [Reentrant]  Нет асинхронного ожидания  Нет защиты хоста  Не проводились тесты на наличие исключений OutOfMemoryException или ThreadAbortException в процессе работы.
  • 26. 26 Написание своей валидации  Фактически любой базовый аспект позволяет переопределить самостоятельно метод CompileTimeValidate() для валидации на этапе компиляции [Serializable] public class MethodAttribute : OnMethodBoundaryAspect { public override bool CompileTimeValidate(MethodBase method) { } } [Serializable] public class TypeAspect : TypeLevelAspect { public override bool CompileTimeValidate(Type type) { } }