# Многопоточность и Асинхронность

### Темы:

* Понимание терминов Процесс, Поток, Пулл потоков, Мертвая блокировка
* Понимание концепций Многопоточного программирования, Асинхронного программирования и Параллелизма
* Класс Thread: Start, Join, Abort, Sleep | Фоновые и активные потоки
* Ключевые слова async и await, Syncronization Context
* Класс Task, Использование методов Run, Delay, WhenAny, WhenAll, ContinueWith, Обработка исключений, AggregateException
* Необходимость использования синхронизации потоков | Простая синхронизация потоков: ключевое слово lock, Monitor.Enter, Monitor.Exit, Interlocked
* PLINQ: Parallel.For, Parallel.ForEach, AsParallel, AsOrdered, WithCancellation
* Сихнронизация потоков: Mutex, Semaphor, AutoResetEvent, ManualResetEvent, Reader/Writer Locks, volatile
* Использование потокобезопасных коллекций: ConcurrentBag, IProducerConsumerCollection, ConcurrentDictionary
* Тестирование асинхронных методов
* Task Scheduling
* Неизменяемые коллекции: ImmutableList, ImmutableDictionary, ImmutableHashSet

### Контрольные вопросы:

* Что такое Виртуальное адресное пространство?
* Почему большое количество параллельных потоков могут ухудшить производительность приложения?
* В чем разница между Потоком и Процессом?
* Когда возникает Мертвая блокировка?
* В чем разница между Thread.Sleep и Task.Delay?
* В чем разница между Lock и Monitor?
* В чем разница между Thread и Task?
* Почему неизменяемые типы являются потокобезопасными?
* В чем разница между Многопоточным и Асинхронным программированием?
* Когда нужно думать о синхронизации потоков?
* В чем разница между механизмами синхронизации Mutex и Semaphore?
* Почему примитивные операции инкремента или присваивания нужно синхронизировать классом Interlocked?
* Что такое ReaderWriterLockSlim?
* Как создать потокобезопасный Синглтон?
* Является ли класс Lazy\<T> потокобезопасным?

### **Источники:**

**Книги:**

* [C# in a Nutshell](http://www.albahari.com/nutshell/bookcontents.aspx) by Joe Albahari, Ben Albahari
* CLR via C# by Jeffrey Richter
* [Concurrency in C# Cookbook](https://www.amazon.com/Concurrency-Cookbook-Asynchronous-Multithreaded-Programming/dp/149205450X/ref=dp_ob_title_bk) by Stephen Cleary

**Статьи:**

* [Основы многопоточности в .NET Framework](https://habr.com/ru/company/nix/blog/260745/)
* [Введение в PLINQ](https://docs.microsoft.com/ru-ru/dotnet/standard/parallel-programming/introduction-to-plinq)
* [Многопоточное vs асинхронное программирование](https://ru.stackoverflow.com/questions/445768/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B5-vs-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
* [.NET: Инструменты для работы с многопоточностью и асинхронностью](https://habr.com/ru/post/452094/)
* [ConfigureAwait: часто задаваемые вопросы](https://habr.com/ru/post/482354/)
* [Parallel Computing - It's All About the SynchronizationContext](https://docs.microsoft.com/en-us/archive/msdn-magazine/2011/february/msdn-magazine-parallel-computing-it-s-all-about-the-synchronizationcontext)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://g-klensky.gitbook.io/roadmap/tech-skills/c/mnogopotochnost-i-asinkhronnost.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
