Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Дмитрий Иванов «Итак, вы всё-таки решили писать многозадачные приложения на .NET»

Дмитрий Иванов «Итак, вы всё-таки решили писать многозадачные приложения на .NET»

Посмотрим с разных сторон на механизмы многозадачности в .Net: с высоты птичьего полёта, в исторической перспективе и изнутри. Разберёмся с эволюцией параллельного API в .Net, дойдём до современности и поймём, как писать State of The Art Task Based Async Code. Посмотрим, как правильно синхронизироваться между потоками? А как быстро это работает? А надо ли это вообще? Напишем Interlocked-структуру. Рассмотрим, какие инструменты нам помогут в разработке многопоточного приложения.

DotNetRu

July 22, 2015
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. Примитивы синхронизации lock(), Monitor, [Synchronized] EventWaitHandle: Manual, Auto Mutex –

    межпроцессное взаимодействие Barrier, CountDownEvent, Semaphore Slim, SpinWait – для короткого времени ожидания WaitHandle, Kernel32Dll
  2. ReadWriteLock Всегда используйте Slim (или велосипед =) Upgradable – только

    один тред Fairness, starvation using вместо try... finally TryEnterReadLock, TryEnterWriteLock
  3. Memory barriers Значения “оседают” в регистрах, Store buffer, Write Combining

    buffer Instruction reordering Процессорные инструкции: mfence, lfence, sfence Thread.MemoryBarrier(), volatile, Volatile.Read(), Volatile.Write()
  4. Неблокирующие алгоритмы Процессорные инструкции: cmpxchg xadd, префикс lock Interloked: Read(Int64),

    Increment, Exchange, CompareExchange Зачем: – Пишем свою структуру данных – Весело =) Тесты, тесты и еще раз тесты !!!
  5. Модели многопоточного приложения Транзакционная – Immutable state – no locking

    – Commit/Rollback Пессимистичная – Глобальный RwLock – Прерываемые Read-ы Акторы, COM
  6. Модель ReSharper Main thread – Разрешен AcquireWrite – Разрешен Upgrade

    – Разрешен AcquireRead Pool thread – Разрешён TryAcquireRead – Везде CheckForInterrupt (<200ms) – Запрещён TryAcquireWrite
  7. Другие конструкции SingleThreadExecutorView - Actor – Очередь тасков – Возможно

    синхронное ожидаение – Stealing тасков TaskBarrier (IDisposable) – Таски могут порождают таски – Топологическая сортировка зависимых тасков
  8. Cредства анализа Видимые тормоза, дёрганность, лаги при тайпинге → подвисание

    UIThread (не качается очередь сообщений) Проверяем: между CheckForInterrupt < 200ms Проверяем: WriteLock.Acquire < 200ms DotTrace Timeline
  9. 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
  10. Старое API APM – IAsyncResult, BeginXxx(AsyncCallback), EndXxx() EAP – XxxAsync(),

    XxxCompletedEventHandler, XxxAsyncCancel() или CancelAsync() Адаптер для IOBound tasks → TaskCompletionSource
  11. Неблокирующее API Task.Delay(), TaskCompletionSource ContinueWith(), ContinueWhenAll() async /await – сахар

    для ContinueWith parent / child - неблокирующее ожидание (TaskCreationOptions.AttachedToParent)