Версия 24.9 от Alexandr Fokin на 2022/07/29 03:48

Скрыть последних авторов
Alexandr Fokin 24.7 1 | |
2 |Понятие критической секции.|Некоторый блок кода, в котором работа несколько поток ограничивается или управляется некоторым образом. Например в критической секции разрешена работа только одного потока, остальные потоки будут ожидать.
3 (Т.е. пессимистичная блокировка)
4 |Понятие токена.|(Поток проверяет токен, если токен свободен - забирает себе, иначе ожидает освобождения. В конце секции поток освобождает токен)
Alexandr Fokin 4.1 5
Alexandr Fokin 24.7 6 ----
Alexandr Fokin 4.1 7
Alexandr Fokin 24.8 8 === Некоторые примитивы синхронизации ===
Alexandr Fokin 5.1 9
Alexandr Fokin 24.7 10 |(% style="width:251px" %) |(% style="width:1271px" %)
11 |(% style="width:251px" %)Monitor и конструкция Lock|(% style="width:1271px" %)(((
12 Реализуют идею критической секции: то есть код, написанный между вызовами Monitor.Enter, Monitor.Exit на одном ресурсе может быть выполнен в один момент времени лишь одним потоком.
Alexandr Fokin 5.1 13
Alexandr Fokin 24.7 14 Оператор lock оберткой над Enter/Exit обернутых в try-finally.
15 )))
16 |(% style="width:251px" %)Semaphore|(% style="width:1271px" %)Семафоры позволяют ограничить доступ выполнения кода определенным количеством потоков.
17 |(% style="width:251px" %)Mutex|(% style="width:1271px" %)Используется для синхронизации на уровне операционной системы.
18 Может использоваться несколькими приложениями в рамках одной ОС.
19 |(% style="width:251px" %)ReaderWriterLock
20 ReaderWriterLockSlim|(% style="width:1271px" %)Либо много потоков читает, либо 1 поток пишет.
21 |(% style="width:251px" %) |(% style="width:1271px" %)
Alexandr Fokin 5.1 22
Alexandr Fokin 24.7 23 (% style="width:432px" %)
24 |(% style="width:386px" %)Конструкции пользовательского режима|(% style="width:43px" %)
25 |(% style="width:386px" %)Конструкции режима ядра|(% style="width:43px" %)
26 |(% style="width:386px" %)Гибридные конструкции синхронизации потоков|(% style="width:43px" %)
Alexandr Fokin 6.1 27
Alexandr Fokin 24.7 28 Материалы:
29
30 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1
31 https://habr.com/ru/post/452094
32 * .NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2
33 https://habr.com/ru/post/459514
34
35 ----
36
37 === Шаблон ===
38
39 При использовании инструментов важно освобождать освобождать блокировку, даже если в процессе выполнения логики возникнет исключение.
40 Во многих случаях имеет смысл реализовывать объект обертку, реализующую блокировку, и не допускающую неправильное использование.
41 Общий шаблон использования:
42
Alexandr Fokin 6.1 43 {{code language="c#"}}
Alexandr Fokin 24.7 44 EnterLock();
Alexandr Fokin 4.1 45 try
Alexandr Fokin 24.7 46 {
Alexandr Fokin 4.1 47 //... Action
48 }
Alexandr Fokin 7.1 49 catch {}
Alexandr Fokin 4.1 50 finally
51 {
Alexandr Fokin 24.7 52 ReleaseLock();
Alexandr Fokin 4.1 53 }
Alexandr Fokin 6.1 54 {{/code}}
Alexandr Fokin 4.1 55
Alexandr Fokin 24.7 56 ----
57
Alexandr Fokin 24.8 58 Простой пример:
Alexandr Fokin 4.1 59 Запись в один и тот же файл с разных потоков. (В определенный момент времени в файл записывает только 1 поток)
60
Alexandr Fokin 24.7 61 ----
Alexandr Fokin 22.1 62
Alexandr Fokin 24.7 63 ==== Книги ====
Alexandr Fokin 22.1 64
Alexandr Fokin 24.4 65 * [[Асинхронное программирование в C# 5.0 | O’Reilly>>doc:Книги.O’Reilly.Асинхронное программирование в C# 5\.0 | O’Reilly.WebHome]]
Alexandr Fokin 24.3 66 * [[Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование. | O’Reilly>>doc:Книги.O’Reilly.Конкурентность в C#\. Асинхронное, параллельное и многопоточное программирование\. | O’Reilly.WebHome]]
Alexandr Fokin 24.7 67 * [[CLR via C# | Джеффри Рихтер>>Книги.CLR via C# | Джеффри Рихтер.WebHome]]
Alexandr Fokin 24.3 68
69