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

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

Скрыть последних авторов
Alexandr Fokin 1.2 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}}