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

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

От версии 1.1 >
отредактировано Alexandr Fokin
на 2022/10/04 17:42
К версии < 1.2 >
отредактировано Alexandr Fokin
на 2022/10/04 17:44
>
Изменить комментарий: К данной версии нет комментариев

Комментарий

Подробности

Свойства страницы
Содержимое
... ... @@ -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}}