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

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