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

Версия 1.8 от Alexandr Fokin на 2022/11/13 18:56

Скрыть последних авторов
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.3 11 |(% style="width:590px" %) |(% style="width:892px" %)
12 |(% style="width:590px" %)(((
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 )))
20 |(% style="width:590px" %)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.3 22
Alexandr Fokin 1.2 23 | |
Alexandr Fokin 1.4 24 |Monitor|(((
25 Реализуют идею критической секции. Ограничивает степень параллелизма на секциях, находящихся после Monitor.Enter, одним потоком.
Alexandr Fokin 1.2 26 )))
Alexandr Fokin 1.4 27 |Lock|Оператор lock является оберткой над классом Monitor, его операциями Enter/Exit, обернутыми в try-finally.
28 |Semaphore
29 SemaphoreSlim|Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков.
Alexandr Fokin 1.2 30 |Mutex|Используется для синхронизации на уровне операционной системы.
31 Может использоваться несколькими приложениями в рамках одной ОС.
32 |ReaderWriterLock
Alexandr Fokin 1.4 33 ReaderWriterLockSlim|Позволяет ограничить параллелизм либо 1 писателем, либо многими читателями.
34 |Spin*|
Alexandr Fokin 1.2 35
36 ----
37
Alexandr Fokin 1.4 38 === Материалы ===
Alexandr Fokin 1.2 39
Alexandr Fokin 1.7 40 * [[Блокировки>>doc:Архитектура и модели.Блокировки.WebHome]]
Alexandr Fokin 1.6 41 * Общие сведения о примитивах синхронизации
42 [[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 43 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1
44 [[https:~~/~~/habr.com/ru/post/452094>>https://habr.com/ru/post/452094]]
45 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2
46 [[https:~~/~~/habr.com/ru/post/459514>>https://habr.com/ru/post/459514]]
47
48 ----
49
50 === Шаблон ===
51
52 При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение.
53 Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование.
54 Общий шаблон использования:
55
56 {{code language="c#"}}
57 EnterLock();
58 try
59 {
60 //... Action
61 }
62 // catch {}
63 finally
64 {
65 ReleaseLock();
66 }
67 {{/code}}