Изменения документа Примитивы синхронизации
Редактировал(а) Alexandr Fokin 2023/10/09 10:03
отредактировано Alexandr Fokin
на 2022/10/04 17:42
на 2022/10/04 17:42
отредактировано Alexandr Fokin
на 2022/10/04 17:44
на 2022/10/04 17:44
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -1,0 +1,52 @@ 1 +=== Типы примитивов. === 2 + 3 +|Конструкции пользовательского режима| 4 +|Конструкции режима ядра| 5 +|Гибридные конструкции синхронизации потоков| 6 + 7 +---- 8 + 9 +=== Некоторые примитивы синхронизации === 10 + 11 +| | 12 +|Monitor и конструкция Lock|((( 13 +Реализуют идею критической секции: то есть код, написанный между вызовами Monitor.Enter, Monitor.Exit на одном ресурсе может быть выполнен в один момент времени лишь одним потоком. 14 + 15 +Оператор lock оберткой над Enter/Exit обернутых в try-finally. 16 +))) 17 +|Semaphore|Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков. 18 +|Mutex|Используется для синхронизации на уровне операционной системы. 19 +Может использоваться несколькими приложениями в рамках одной ОС. 20 +|ReaderWriterLock 21 +ReaderWriterLockSlim|Либо много потоков читает, либо 1 поток пишет. 22 +| | 23 + 24 +---- 25 + 26 +Материалы: 27 + 28 +* .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1 29 +[[https:~~/~~/habr.com/ru/post/452094>>https://habr.com/ru/post/452094]] 30 +* .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2 31 +[[https:~~/~~/habr.com/ru/post/459514>>https://habr.com/ru/post/459514]] 32 + 33 +---- 34 + 35 +=== Шаблон === 36 + 37 +При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение. 38 +Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование. 39 +Общий шаблон использования: 40 + 41 +{{code language="c#"}} 42 +EnterLock(); 43 +try 44 +{ 45 + //... Action 46 +} 47 +// catch {} 48 +finally 49 +{ 50 + ReleaseLock(); 51 +} 52 +{{/code}}