Версия 18.1 от Alexandr Fokin на 2020/08/17 12:04

Скрыть последних авторов
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 **Taskcompletionsource**
56
57 Материалы:
58 * [[В-чем-смысл-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 59
60
Alexandr Fokin 12.1 61 Книги:
Alexandr Fokin 14.1 62 * [[Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование>>https://wiki.denhome.ru/bin/view/Книги/Конкурентность%20в%20C%23.%20Асинхронное%2C%20параллельное%20и%20многопоточное%20программирование.%20%7C%20O’Reilly]]