Изменения документа Примитивы синхронизации
Редактировал(а) Alexandr Fokin 2023/10/09 10:03
отредактировано Alexandr Fokin
на 2022/10/04 17:42
на 2022/10/04 17:42
отредактировано Alexandr Fokin
на 2023/02/09 01:46
на 2023/02/09 01:46
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Родительский документ
-
... ... @@ -1,1 +1,1 @@ 1 -Разработка.NET.C#.Многопоточность.WebHome 1 +Разработка.NET.C#.Многопоточность и асинхронность.WebHome - Содержимое
-
... ... @@ -1,0 +1,78 @@ 1 +=== Типы примитивов === 2 + 3 +|Конструкции пользовательского режима| 4 +|Конструкции режима ядра| 5 +|Гибридные конструкции синхронизации потоков| 6 + 7 +---- 8 + 9 +=== Некоторые примитивы синхронизации === 10 + 11 +|(% style="width:608px" %)Конструкции пользовательского режима|(% style="width:892px" %) 12 +|(% style="width:608px" %)((( 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:608px" %)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 +|(% style="width:288px" %) |(% style="width:1207px" %) 25 +|(% style="width:288px" %)Monitor (Гибридные конструкции 26 +синхронизации потоков)|(% style="width:1207px" %)((( 27 +Реализуют идею критической секции. Ограничивает степень параллелизма на секциях, находящихся после Monitor.Enter, одним потоком. 28 +))) 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" %)Используется для синхронизации на уровне операционной системы. 33 +Может использоваться несколькими приложениями в рамках одной ОС. 34 +|(% style="width:288px" %)ReaderWriterLock 35 +ReaderWriterLockSlim (Гибридные конструкции 36 +синхронизации потоков)|(% style="width:1207px" %)Позволяет ограничить параллелизм либо 1 писателем, либо многими читателями. 37 +|(% style="width:288px" %)AutoResetEvent (Конструкции режима ядра) 38 +ManualResetEven (Конструкции режима ядра)|(% style="width:1207px" %)Имеет 2 состояния (взведен и не взведен). 39 +Позволяет ожидать взведенного состояния. 40 +Содержит методы для взведения. 41 +|(% style="width:288px" %)CountdownEvent (Гибридные конструкции 42 +синхронизации потоков)|(% style="width:1207px" %)При инициализации задается значение счетчика. 43 +Позволяет ожидать, когда значение счетчика будет равно 0. 44 +Метод уменьшающий счетчик. 45 +|(% style="width:288px" %)Spin*|(% style="width:1207px" %) 46 + 47 +---- 48 + 49 +=== Материалы === 50 + 51 +* [[Блокировки>>doc:Архитектура и модели.Блокировки.WebHome]] 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]] 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]] 58 + 59 +---- 60 + 61 +=== Шаблон === 62 + 63 +При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение. 64 +Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование. 65 +Общий шаблон использования: 66 + 67 +{{code language="c#"}} 68 +EnterLock(); 69 +try 70 +{ 71 + //... Action 72 +} 73 +// catch {} 74 +finally 75 +{ 76 + ReleaseLock(); 77 +} 78 +{{/code}}