SlideShare a Scribd company logo
Многопоточность в .NET:
Дьявол в деталях
Дмитрий Иванов, JetBrains
Многозадачность
Многозадачнось vs Многопоточность
Кооперативная vs Вытесняющая
Процессы(Processes), потоки (Threads),
задачи (Tasks)
Примитивы синхронизации
lock(), Monitor, [Synchronized]
EventWaitHandle: Manual, Auto
Mutex – межпроцессное взаимодействие
Barrier, CountDownEvent, Semaphore
Slim, SpinWait – для короткого времени
ожидания
WaitHandle, Kernel32Dll
Демонстрация
ReaderWriterLock
ReadWriteLock
Всегда используйте Slim (или велосипед =)
Upgradable – только один тред
Fairness, starvation
using вместо try... finally
TryEnterReadLock, TryEnterWriteLock
Memory model
Memory barriers
Значения “оседают” в регистрах, Store
buffer, Write Combining buffer
Instruction reordering
Процессорные инструкции: mfence,
lfence, sfence
Thread.MemoryBarrier(), volatile,
Volatile.Read(), Volatile.Write()
Демонстрация
Double-checked locking
Неблокирующие алгоритмы
Процессорные инструкции: cmpxchg
xadd, префикс lock
Interloked: Read(Int64), Increment,
Exchange, CompareExchange
Зачем:
– Пишем свою структуру данных
– Весело =)
Тесты, тесты и еще раз тесты !!!
Демонстрация
BlockingQueue
Демонстрация
BlockingQueue
Модели многопоточного
приложения
Транзакционная
– Immutable state
– no locking
– Commit/Rollback
Пессимистичная
– Глобальный RwLock
– Прерываемые Read-ы
Акторы, COM
COM-объекты
Appartments: STA, MTA, Neutral
COM object creating Упс... =(
GC
Other thread
STA-thread
Модель ReSharper
Main thread
– Разрешен AcquireWrite
– Разрешен Upgrade
– Разрешен AcquireRead
Pool thread
– Разрешён TryAcquireRead
– Везде CheckForInterrupt (<200ms)
– Запрещён TryAcquireWrite
InterruptableReadActivity
UIThread
PoolThread
Check For Interrupt
Continuous Locking
Under ReadLock
Прерывание
UIThread
PoolThread
Somebody asked for WriteLock?
Continuous Locking
ReentrancyGuard
Reentrancy in UI Thread
ExecuteOrQueue
QueueWithReadLock,
QueueWithWriteLock
Dispatcher – вызов без гарда
UIThread
Read
Write
GroupingEvent
prolongate
no prolongate
Другие конструкции
SingleThreadExecutorView - Actor
– Очередь тасков
– Возможно синхронное ожидаение
– Stealing тасков
TaskBarrier (IDisposable)
– Таски могут порождают таски
– Топологическая сортировка зависимых
тасков
Timer API
QueueAt, QueueRecurring
Время: UtcNow
Самое быстрое: Environment.TickCount
IProperty<T>
Isignal<T>, Advise
FlowInto, CreateAnd(bool)
FlowIntoGrouped - GroupingEvent
FlowIntoUiThread – marshalling
File IO
PreprocessSingleThreadedAndParallelize
Buffer = 2
Cредства анализа
Видимые тормоза, дёрганность, лаги
при тайпинге → подвисание UIThread
(не качается очередь сообщений)
Проверяем: между
CheckForInterrupt < 200ms
Проверяем: WriteLock.Acquire < 200ms
DotTrace Timeline
SynchronizationContext
[ThreadStatic]
Send(), Post() (default → ThreadPool)
Wait() (через WaitHelper)
WPF →
DispatcherSynchronizationContext
Tasks
Task(Action), Task<T>(Func<T>)
short vs long
Lifecycle (status): created → started →
executing → completed (canceled, failed)
Interruptable: CancellationToken
Блокирующee API: Wait (One/All/Any)
Task.Start(), Schedulers
Демонстрация
Tasks, Cancellation,
WPF context & scheduler
Старое API
APM
– IAsyncResult, BeginXxx(AsyncCallback),
EndXxx()
EAP
– XxxAsync(), XxxCompletedEventHandler,
XxxAsyncCancel() или CancelAsync()
Адаптер для IOBound tasks →
TaskCompletionSource
Неблокирующее API
Task.Delay(), TaskCompletionSource
ContinueWith(), ContinueWhenAll()
async /await – сахар для ContinueWith
parent / child - неблокирующее
ожидание
(TaskCreationOptions.AttachedToParent)
Демонстрация
Эмулируем Async
Вопросы и ответы
?
?
?
?
?
?
?
?
?
?

More Related Content

Similar to Многопоточность в .NET: Дьявол в деталях

Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)
Ontico
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
HighLoad2009
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
Омские ИТ-субботники
 

Similar to Многопоточность в .NET: Дьявол в деталях (7)

Presentation_1369080393540
Presentation_1369080393540Presentation_1369080393540
Presentation_1369080393540
 
Секреты сборки мусора в Java
Секреты сборки мусора в JavaСекреты сборки мусора в Java
Секреты сборки мусора в Java
 
Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)Секреты сборки мусора в Java (Алексей Рагозин)
Секреты сборки мусора в Java (Алексей Рагозин)
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 

More from Mikhail Shcherbakov

More from Mikhail Shcherbakov (20)

Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Mythbusters - Web Application Security
Mythbusters - Web Application SecurityMythbusters - Web Application Security
Mythbusters - Web Application Security
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Apache Ignite.NET в действии
Apache Ignite.NET в действииApache Ignite.NET в действии
Apache Ignite.NET в действии
 
Архитектура Apache Ignite .NET
Архитектура Apache Ignite .NETАрхитектура Apache Ignite .NET
Архитектура Apache Ignite .NET
 
Знакомство с In-Memory Data Grid
Знакомство с In-Memory Data GridЗнакомство с In-Memory Data Grid
Знакомство с In-Memory Data Grid
 
сценарии использования статического анализатора
сценарии использования статического анализаторасценарии использования статического анализатора
сценарии использования статического анализатора
 
WCF. Легко или проблемно
WCF. Легко или проблемноWCF. Легко или проблемно
WCF. Легко или проблемно
 
Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#Поиск ошибок в программах на языке C#
Поиск ошибок в программах на языке C#
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Project Rider
Project RiderProject Rider
Project Rider
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Structured logging
Structured loggingStructured logging
Structured logging
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
Простой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NETПростой и кросс-платформенный WEB-сервер на .NET
Простой и кросс-платформенный WEB-сервер на .NET
 
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектахИспользование Visual Studio Tools for Apache Cordova в реальных проектах
Использование Visual Studio Tools for Apache Cordova в реальных проектах
 
Sandboxing in .NET CLR
Sandboxing in .NET CLRSandboxing in .NET CLR
Sandboxing in .NET CLR
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 

Многопоточность в .NET: Дьявол в деталях

Editor's Notes

  1. Рассказать про порядок взятия Рассказать про скорость работы Спин-вейт в локе перед сном