Исходный код вики Примитивы синхронизации

Редактировал(а) Alexandr Fokin 2023/10/09 10:03

Скрыть последних авторов
Alexandr Fokin 1.8 1 === Типы примитивов ===
Alexandr Fokin 1.2 2
3 |Конструкции пользовательского режима|
4 |Конструкции режима ядра|
5 |Гибридные конструкции синхронизации потоков|
6
7 ----
8
Alexandr Fokin 1.3 9 === Некоторые примитивы синхронизации ===
Alexandr Fokin 1.2 10
Alexandr Fokin 1.16 11 |(% style="width:608px" %)Конструкции пользовательского режима|(% style="width:892px" %)
12 |(% style="width:608px" %)(((
Alexandr Fokin 1.3 13 volatile
14 [[https:~~/~~/learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/volatile>>https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/volatile]]
15 [[https:~~/~~/learn.microsoft.com/ru-ru/dotnet/api/system.threading.volatile?view=net-5.0>>https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.volatile?view=net-5.0]]
16 )))|(% style="width:892px" %)(((
17 1. Модификатор переменных, ограничивающий оптимизации компилятора c#.
18 1. Класс, содержащий методы, которые помимо операции чтения/записи накладывают ограничение (барьер), не позволяющее процессору менять порядок выполнения команд.
19 )))
Alexandr Fokin 1.16 20 |(% style="width:608px" %)Interlocked
Alexandr Fokin 1.5 21 [[https:~~/~~/learn.microsoft.com/ru-ru/dotnet/api/system.threading.interlocked?view=net-5.0>>https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.interlocked?view=net-5.0]]|(% style="width:892px" %)Предоставляет набор некоторых операций, гарантирующих атомарность выполнения.
Alexandr Fokin 1.14 22 Являет предпочтительным по сравнению с явной блокировкой.
Alexandr Fokin 1.3 23
Alexandr Fokin 1.16 24 |(% style="width:288px" %) |(% style="width:1207px" %)
25 |(% style="width:288px" %)Monitor (Гибридные конструкции
26 синхронизации потоков)|(% style="width:1207px" %)(((
Alexandr Fokin 1.15 27 Реализуют идею критической секции. Ограничивает степень параллелизма на секциях, находящихся после Monitor.Enter, одним потоком.
Alexandr Fokin 1.2 28 )))
Alexandr Fokin 1.16 29 |(% style="width:288px" %)Lock|(% style="width:1207px" %)Оператор lock является оберткой над классом Monitor, его операциями Enter/Exit, обернутыми в try-finally.
30 |(% style="width:288px" %)Semaphore (Конструкции режима ядра)
31 SemaphoreSlim|(% style="width:1207px" %)Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков.
32 |(% style="width:288px" %)Mutex (Конструкции режима ядра)|(% style="width:1207px" %)Используется для синхронизации на уровне операционной системы.
Alexandr Fokin 1.2 33 Может использоваться несколькими приложениями в рамках одной ОС.
Alexandr Fokin 1.16 34 |(% style="width:288px" %)ReaderWriterLock
35 ReaderWriterLockSlim (Гибридные конструкции
36 синхронизации потоков)|(% style="width:1207px" %)Позволяет ограничить параллелизм либо 1 писателем, либо многими читателями.
37 |(% style="width:288px" %)AutoResetEvent (Конструкции режима ядра)
38 ManualResetEven (Конструкции режима ядра)|(% style="width:1207px" %)Имеет 2 состояния (взведен и не взведен).
Alexandr Fokin 1.13 39 Позволяет ожидать взведенного состояния.
40 Содержит методы для взведения.
Alexandr Fokin 1.16 41 |(% style="width:288px" %)CountdownEvent (Гибридные конструкции
42 синхронизации потоков)|(% style="width:1207px" %)При инициализации задается значение счетчика.
Alexandr Fokin 1.13 43 Позволяет ожидать, когда значение счетчика будет равно 0.
44 Метод уменьшающий счетчик.
Alexandr Fokin 1.16 45 |(% style="width:288px" %)Spin*|(% style="width:1207px" %)
Alexandr Fokin 1.2 46
47 ----
48
Alexandr Fokin 1.4 49 === Материалы ===
Alexandr Fokin 1.2 50
Alexandr Fokin 1.7 51 * [[Блокировки>>doc:Архитектура и модели.Блокировки.WebHome]]
Alexandr Fokin 1.6 52 * Общие сведения о примитивах синхронизации
53 [[https:~~/~~/learn.microsoft.com/ru-ru/dotnet/standard/threading/overview-of-synchronization-primitives?source=recommendations>>https://learn.microsoft.com/ru-ru/dotnet/standard/threading/overview-of-synchronization-primitives?source=recommendations]]
Alexandr Fokin 1.2 54 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1
55 [[https:~~/~~/habr.com/ru/post/452094>>https://habr.com/ru/post/452094]]
56 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2
57 [[https:~~/~~/habr.com/ru/post/459514>>https://habr.com/ru/post/459514]]
Alexandr Fokin 1.17 58 * Барьеры памяти и неблокирующая синхронизация в .NET
59 [[https:~~/~~/habr.com/ru/articles/130318/>>https://habr.com/ru/articles/130318/]]
Alexandr Fokin 1.18 60 * Threading in C# Joseph Albahari
61 [[https:~~/~~/www.albahari.com/threading/part2.aspx>>https://www.albahari.com/threading/part2.aspx]]
Alexandr Fokin 1.2 62
63 ----
64
65 === Шаблон ===
66
67 При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение.
68 Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование.
69 Общий шаблон использования:
70
71 {{code language="c#"}}
72 EnterLock();
73 try
74 {
75 //... Action
76 }
77 // catch {}
78 finally
79 {
80 ReleaseLock();
81 }
82 {{/code}}