Версия 11.1 от Alexandr Fokin на 2020/06/06 10:20

Скрыть последних авторов
Alexandr Fokin 4.1 1
2 **Инструменты работы с многопоточностью.**
3
4 Понятие критической секции.
5 Некоторый блок кода, в котором работа несколько поток ограничевается или управляетя некоторым образом. Например в критической секции разрешена работа только одного потока, остальные потоки будут ожидать.
6
7 Понятие токена. (Поток проверяет токен, если токен свободен - забирает себе, иначе ожидает. В конце секции поток освобождает токен)
8
Alexandr Fokin 5.1 9 Monitor.Enter, Monitor.Exit, lock
10 Это самые часто используемые конструкции для синхронизации потоков. Реализуют идею критической секции: то есть код, написанный между вызовами Monitor.Enter, Monitor.Exit на одном ресурсе может быть выполнен в один момент времени лишь одним потоком. Оператор lock является синтаксическим сахаром вокруг вызовов Enter/Exit обернутых в try-finally. Приятной особенностью реализации критической секции в .NET является возможность повторного входа в нее для одного и того же потока.
11
12 Mutex нужен для синронизации на уровне ОС. (Может использоваться несколькими приложениями)
Alexandr Fokin 5.6 13 Семафоры позволяют ограничить доступ определенным количеством потоков.
Alexandr Fokin 5.1 14
15 ReaderWriterLockSlim
16 Либо много потоков читает, либо 1 поток пишет
17
Alexandr Fokin 4.1 18 При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения вылетит exception.
19 Шаблон:
Alexandr Fokin 6.1 20
21 {{code language="c#"}}
Alexandr Fokin 4.1 22 try
23 {
24 LockSection();
25 //... Action
26 }
Alexandr Fokin 7.1 27 catch {}
Alexandr Fokin 4.1 28 finally
29 {
30 UnlockSection();
31 }
Alexandr Fokin 6.1 32 {{/code}}
Alexandr Fokin 4.1 33
34 Примеры
35 Запись в один и тот же файл с разных потоков. (В определенный момент времени в файл записывает только 1 поток)
36 Работа с кешем приложения.
37
38 Материалы:
39 * [[.NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1>>https://habr.com/ru/post/452094/]]
40 * [[.NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2>>https://habr.com/ru/post/459514/]]
41
42
43
44 **Thread VS Task**
45
46 Thread Pool (Пул потоков)
47
48 Thread - физический поток в приложении
49 Task - логическая задача, которая может выполниться в потоке из Thread Pool.
50 Для Task, которые будет выполняться длительное время стоит использовать метку.
51
52 Материалы:
53 * [[Использование тасков в C#>>http://sonyks2007.blogspot.com/2013/11/c_11.html]]
54
55
56
57 **Async/Await**
58
59 Понятие конктеста выполнения.
60
61 Более мягкий подход к асинхронности.
62 Асинхронный код записывается в синхронном виде (Выглядит последовательно), но при этом в момент выполнения задач, выполняющий поток не простаивает, а освобождается и может выполнять другие задачи.
63 В случае desctop приложения это позволяет не блокировать UI (зависание основного потока во время выполнения операций).
64 В случае web приложений, данный подход позволяет обрабатывать больше активных подключений. (Поток обрабатывает запрос, сталкивается с асинхронной операцией, освобождается и может обработать другие входящие запросы. При окончании асинхронной операции тот-же или другой поток продолжит выполнение) Т.е. прирост не в скорости работы, а в пиковой нагрузке по кол-ву соединений, за счет освобождения потоков, ожидающих завершения асинхронных операций. При этом присутсвуют небольшие накладные расходы, связанные с работой Async/Await.
Alexandr Fokin 8.1 65 [[devblogs.microsoft| ConfigureAwait FAQ>>https://devblogs.microsoft.com/dotnet/configureawait-faq/?utm_source=csharp&utm_medium=email&utm_campaign=digest]]
Alexandr Fokin 4.1 66
67 Материалы:
Alexandr Fokin 5.4 68 * [[Habr Async/await в C#: концепция, внутреннее устройство, полезные приемы>>https://habr.com/ru/post/470830/]]
69 * [[Metanit Aсинхронное программирование>>https://metanit.com/sharp/tutorial/13.3.php]]
Alexandr Fokin 5.5 70 * [[Habr Асинхронный рассинхрон: антипаттерны в работе с async/await в .NET>>https://habr.com/ru/company/dodopizzadev/blog/435666/]]
71 * [[Habr Async/await в C#: подводные камни>>https://habr.com/ru/post/257221/]]
Alexandr Fokin 5.7 72 * [[Habr Async/await и механизм реализации в C# 5.0>>https://habr.com/ru/post/260217/]]
Alexandr Fokin 4.1 73
74
75 **Taskcompletionsource**
76
77 Материалы:
78 * [[В-чем-смысл-taskcompletionsourcet-и-когда-его-лучше-использовать>>https://ru.stackoverflow.com/questions/780270/%D0%92-%D1%87%D0%B5%D0%BC-%D1%81%D0%BC%D1%8B%D1%81%D0%BB-taskcompletionsourcet-%D0%B8-%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0-%D0%B5%D0%B3%D0%BE-%D0%BB%D1%83%D1%87%D1%88%D0%B5-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C]]
Alexandr Fokin 11.1 79
80
81 **[[Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование.>>https://wiki.denhome.ru/bin/view/Книги/Конкурентность%20в%20C%23.%20Асинхронное%2C%20параллельное%20и%20многопоточное%20программирование.%20%7C%20O’Reilly]]**