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

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

От версии 1.1 >
отредактировано Alexandr Fokin
на 2022/10/04 17:42
К версии < 1.13 >
отредактировано Alexandr Fokin
на 2023/01/12 13:51
>
Изменить комментарий: К данной версии нет комментариев

Комментарий

Подробности

Свойства страницы
Родительский документ
... ... @@ -1,1 +1,1 @@
1 -Разработка.NET.C#.Многопоточность.WebHome
1 +Разработка.NET.C#.Многопоточность и асинхронность.WebHome
Содержимое
... ... @@ -1,0 +1,74 @@
1 +=== Типы примитивов ===
2 +
3 +|Конструкции пользовательского режима|
4 +|Конструкции режима ядра|
5 +|Гибридные конструкции синхронизации потоков|
6 +
7 +----
8 +
9 +=== Некоторые примитивы синхронизации ===
10 +
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 +
23 +| |
24 +|Monitor|(((
25 + Реализуют идею критической секции. Ограничивает степень параллелизма на секциях, находящихся после Monitor.Enter, одним потоком.
26 +)))
27 +|Lock|Оператор lock является оберткой над классом Monitor, его операциями Enter/Exit, обернутыми в try-finally.
28 +|Semaphore
29 +SemaphoreSlim|Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков.
30 +|Mutex|Используется для синхронизации на уровне операционной системы.
31 +Может использоваться несколькими приложениями в рамках одной ОС.
32 +|ReaderWriterLock
33 +ReaderWriterLockSlim|Позволяет ограничить параллелизм либо 1 писателем, либо многими читателями.
34 +|AutoResetEvent
35 +ManualResetEven|Имеет 2 состояния (взведен и не взведен).
36 +Позволяет ожидать взведенного состояния.
37 +Содержит методы для взведения.
38 +|CountdownEvent|При инициализации задается значение счетчика.
39 +Позволяет ожидать, когда значение счетчика будет равно 0.
40 +Метод уменьшающий счетчик.
41 +|Spin*|
42 +
43 +----
44 +
45 +=== Материалы ===
46 +
47 +* [[Блокировки>>doc:Архитектура и модели.Блокировки.WebHome]]
48 +* Общие сведения о примитивах синхронизации
49 +[[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]]
50 +* .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1
51 +[[https:~~/~~/habr.com/ru/post/452094>>https://habr.com/ru/post/452094]]
52 +* .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2
53 +[[https:~~/~~/habr.com/ru/post/459514>>https://habr.com/ru/post/459514]]
54 +
55 +----
56 +
57 +=== Шаблон ===
58 +
59 +При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение.
60 +Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование.
61 +Общий шаблон использования:
62 +
63 +{{code language="c#"}}
64 +EnterLock();
65 +try
66 +{
67 + //... Action
68 +}
69 +// catch {}
70 +finally
71 +{
72 + ReleaseLock();
73 +}
74 +{{/code}}