Версия 15.1 от Alexandr Fokin на 2020/06/11 13:34

Последние авторы
1
2 **Инструменты работы с многопоточностью.**
3
4 Понятие критической секции.
5 Некоторый блок кода, в котором работа несколько поток ограничевается или управляетя некоторым образом. Например в критической секции разрешена работа только одного потока, остальные потоки будут ожидать.
6
7 Понятие токена. (Поток проверяет токен, если токен свободен - забирает себе, иначе ожидает. В конце секции поток освобождает токен)
8
9 Monitor.Enter, Monitor.Exit, lock
10 Это самые часто используемые конструкции для синхронизации потоков. Реализуют идею критической секции: то есть код, написанный между вызовами Monitor.Enter, Monitor.Exit на одном ресурсе может быть выполнен в один момент времени лишь одним потоком. Оператор lock является синтаксическим сахаром вокруг вызовов Enter/Exit обернутых в try-finally. Приятной особенностью реализации критической секции в .NET является возможность повторного входа в нее для одного и того же потока.
11
12 Mutex нужен для синронизации на уровне ОС. (Может использоваться несколькими приложениями)
13 Семафоры позволяют ограничить доступ определенным количеством потоков.
14
15 ReaderWriterLockSlim
16 Либо много потоков читает, либо 1 поток пишет
17
18 При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения вылетит exception.
19 Шаблон:
20
21 {{code language="c#"}}
22 try
23 {
24 LockSection();
25 //... Action
26 }
27 catch {}
28 finally
29 {
30 UnlockSection();
31 }
32 {{/code}}
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.
65
66 DeadLock при async await. Возможен в ситуациях, когда есть контекст синхронизации (UI контекст основного ui потока, ASP контекст запроса)
67 [[devblogs.microsoft| ConfigureAwait FAQ>>https://devblogs.microsoft.com/dotnet/configureawait-faq/?utm_source=csharp&utm_medium=email&utm_campaign=digest]]
68
69
70 Материалы:
71 * [[Habr Async/await в C#: концепция, внутреннее устройство, полезные приемы>>https://habr.com/ru/post/470830/]]
72 * [[Metanit Aсинхронное программирование>>https://metanit.com/sharp/tutorial/13.3.php]]
73 * [[Habr Асинхронный рассинхрон: антипаттерны в работе с async/await в .NET>>https://habr.com/ru/company/dodopizzadev/blog/435666/]]
74 * [[Habr Async/await в C#: подводные камни>>https://habr.com/ru/post/257221/]]
75 * [[Habr Async/await и механизм реализации в C# 5.0>>https://habr.com/ru/post/260217/]]
76
77
78 **Taskcompletionsource**
79
80 Материалы:
81 * [[В-чем-смысл-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]]
82
83
84 Книги:
85 * [[Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование>>https://wiki.denhome.ru/bin/view/Книги/Конкурентность%20в%20C%23.%20Асинхронное%2C%20параллельное%20и%20многопоточное%20программирование.%20%7C%20O’Reilly]]