Версия 24.7 от Alexandr Fokin на 2022/07/29 03:05

Скрыть последних авторов
Alexandr Fokin 24.7 1
Alexandr Fokin 4.1 2
Alexandr Fokin 24.7 3 | |
4 |Понятие критической секции.|Некоторый блок кода, в котором работа несколько поток ограничивается или управляется некоторым образом. Например в критической секции разрешена работа только одного потока, остальные потоки будут ожидать.
5 (Т.е. пессимистичная блокировка)
6 |Понятие токена.|(Поток проверяет токен, если токен свободен - забирает себе, иначе ожидает освобождения. В конце секции поток освобождает токен)
Alexandr Fokin 4.1 7
Alexandr Fokin 24.7 8 ----
Alexandr Fokin 4.1 9
Alexandr Fokin 24.7 10 === Некоторые примитивы синхронизации ===
Alexandr Fokin 5.1 11
Alexandr Fokin 24.7 12 |(% style="width:251px" %) |(% style="width:1271px" %)
13 |(% style="width:251px" %)Monitor и конструкция Lock|(% style="width:1271px" %)(((
14 Реализуют идею критической секции: то есть код, написанный между вызовами Monitor.Enter, Monitor.Exit на одном ресурсе может быть выполнен в один момент времени лишь одним потоком.
Alexandr Fokin 5.1 15
Alexandr Fokin 24.7 16 Оператор lock оберткой над Enter/Exit обернутых в try-finally.
17 )))
18 |(% style="width:251px" %)Semaphore|(% style="width:1271px" %)Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков.
19 |(% style="width:251px" %)Mutex|(% style="width:1271px" %)Используется для синхронизации на уровне операционной системы.
20 Может использоваться несколькими приложениями в рамках одной ОС.
21 |(% style="width:251px" %)ReaderWriterLock
22 ReaderWriterLockSlim|(% style="width:1271px" %)Либо много потоков читает, либо 1 поток пишет.
23 |(% style="width:251px" %) |(% style="width:1271px" %)
Alexandr Fokin 5.1 24
Alexandr Fokin 24.7 25 (% style="width:432px" %)
26 |(% style="width:386px" %)Конструкции пользовательского режима|(% style="width:43px" %)
27 |(% style="width:386px" %)Конструкции режима ядра|(% style="width:43px" %)
28 |(% style="width:386px" %)Гибридные конструкции синхронизации потоков|(% style="width:43px" %)
Alexandr Fokin 6.1 29
Alexandr Fokin 24.7 30 Материалы:
31
32 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1
33 https://habr.com/ru/post/452094
34 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2
35 https://habr.com/ru/post/459514
36
37 ----
38
39 === Шаблон ===
40
41 При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение.
42 Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование.
43 Общий шаблон использования:
44
Alexandr Fokin 6.1 45 {{code language="c#"}}
Alexandr Fokin 24.7 46 EnterLock();
Alexandr Fokin 4.1 47 try
Alexandr Fokin 24.7 48 {
Alexandr Fokin 4.1 49 //... Action
50 }
Alexandr Fokin 7.1 51 catch {}
Alexandr Fokin 4.1 52 finally
53 {
Alexandr Fokin 24.7 54 ReleaseLock();
Alexandr Fokin 4.1 55 }
Alexandr Fokin 6.1 56 {{/code}}
Alexandr Fokin 4.1 57
Alexandr Fokin 24.7 58 ----
59
60 Простой пример
Alexandr Fokin 4.1 61 Запись в один и тот же файл с разных потоков. (В определенный момент времени в файл записывает только 1 поток)
62
Alexandr Fokin 24.7 63 ----
Alexandr Fokin 22.1 64
Alexandr Fokin 4.1 65
66 **Taskcompletionsource**
67
68 Материалы:
Alexandr Fokin 22.1 69
70 * В чем смысл TaskCompletionSource<T> и когда его лучше использовать?
Alexandr Fokin 24.2 71 https://ru.stackoverflow.com/questions/780270/В-чем-смысл-taskcompletionsourcet-и-когда-его-лучше-использовать
Alexandr Fokin 11.1 72
Alexandr Fokin 24.7 73 ==== Книги ====
Alexandr Fokin 22.1 74
Alexandr Fokin 24.4 75 * [[Асинхронное программирование в C# 5.0 | O’Reilly>>doc:Книги.O’Reilly.Асинхронное программирование в C# 5\.0 | O’Reilly.WebHome]]
Alexandr Fokin 24.3 76 * [[Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование. | O’Reilly>>doc:Книги.O’Reilly.Конкурентность в C#\. Асинхронное, параллельное и многопоточное программирование\. | O’Reilly.WebHome]]
Alexandr Fokin 24.7 77 * [[CLR via C# | Джеффри Рихтер>>Книги.CLR via C# | Джеффри Рихтер.WebHome]]
Alexandr Fokin 24.3 78
79