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

Версия 1.3 от Alexandr Fokin на 2022/10/04 17:50

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