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

Последние авторы
1 | |
2 |Понятие критической секции.|Некоторый блок кода, в котором работа несколько поток ограничивается или управляется некоторым образом. Например в критической секции разрешена работа только одного потока, остальные потоки будут ожидать.
3 (Т.е. пессимистичная блокировка)
4 |Понятие токена.|Поток проверяет токен, если токен свободен - забирает себе, иначе ожидает освобождения. В конце секции поток освобождает токен
5
6 ----
7
8 === Некоторые примитивы синхронизации ===
9
10 |(% style="width:251px" %) |(% style="width:1271px" %)
11 |(% style="width:251px" %)Monitor и конструкция Lock|(% style="width:1271px" %)(((
12 Реализуют идею критической секции: то есть код, написанный между вызовами Monitor.Enter, Monitor.Exit на одном ресурсе может быть выполнен в один момент времени лишь одним потоком.
13
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" %)
22
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" %)
27
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
43 {{code language="c#"}}
44 EnterLock();
45 try
46 {
47 //... Action
48 }
49 catch {}
50 finally
51 {
52 ReleaseLock();
53 }
54 {{/code}}
55
56 ----
57
58 Простой пример:
59 Запись в один и тот же файл с разных потоков. (В определенный момент времени в файл записывает только 1 поток)
60
61 ----
62
63 ==== Книги ====
64
65 * [[Асинхронное программирование в C# 5.0 | O’Reilly>>doc:Книги.O’Reilly.Асинхронное программирование в C# 5\.0 | O’Reilly.WebHome]]
66 * [[Конкурентность в C#. Асинхронное, параллельное и многопоточное программирование. | O’Reilly>>doc:Книги.O’Reilly.Конкурентность в C#\. Асинхронное, параллельное и многопоточное программирование\. | O’Reilly.WebHome]]
67 * [[CLR via C# | Джеффри Рихтер>>Книги.CLR via C# | Джеффри Рихтер.WebHome]]
68
69 ----
70
71 {{children/}}
72
73