21
System programing Module 3 Thread

System programing module 3

Embed Size (px)

Citation preview

Page 1: System programing module 3

System programingModule 3 Thread

Page 2: System programing module 3

2

Синхронізація

Andrey Gladky [email protected]

Page 3: System programing module 3

3

Проблеми синхронізаціїЗ огляду на, що всі потоки в домені додатку мають паралельний доступ до даних, що розділяються додатка, уявіть, що може статися, якщо кілька потоків одночасно звернуться до одного і того ж елементу даних.

Оскільки планувальник потоків випадковим чином буде припиняти їхню роботу, що якщо перший потік буде перерваний до того, як завершить свою роботу? - другий потік після цього прочитає нестабільні дані.

Andrey Gladky [email protected]

Page 4: System programing module 3

4

Синхронізація з використанням ключового слова “lock”Це ключове слово дозволяє визначати контекст операторів, які повинні бути синхронізованими між потоками. В результаті вхідні потоки не можуть перервати поточний потік, заважаючи йому завершити свою роботу. Ключове слово lock вимагає вказівки маркера (посилання на об'єкт), який повинен бути отриманий потоком для входу в контекст блокування.

// Використовувати поточний об'єкт як маркер потокуlock(this){ // Весь код всередині цього контексту є безпечним до потокам.}

Однак якщо ви блокуєте область коду всередині відкритого метод, безпечніше (і взагалі краще) оголосити закриту змінну object для використання в якості маркера блокування:

Andrey Gladky [email protected]

Page 5: System programing module 3

5Andrey Gladky [email protected]

Демонстрація

Page 6: System programing module 3

6

Синхронізація з використанням типу System.Threading.MonitorОператор lock мови C# - це насправді скорочена нотація для роботи з класом System.Threading.Monitor. При обробці компілятором C# контекст lock перетворюється в наступну конструкцію:

Monitor.Enter(threadLock);try{ //Do something}finally{ Monitor.Exit(threadLock);}

Andrey Gladky [email protected]

Page 7: System programing module 3

7Andrey Gladky [email protected]

Демонстрація

Page 8: System programing module 3

8

Синхронізація з використанням типу interlockedНе заглядаючи в CIL-код, дуже важко повірити, що присвоювання і прості арифметичні операції не є атомарними. З цієї причини в просторі імен System.Threading існує тип, що дозволяє оперувати одиночним елементом даних атомарно і з меншими накладними витратами, ніж тип Monitor.

Andrey Gladky [email protected]

Метод ОписCompareExchange () Безпечно перевіряє два значення на рівність і, якщо

вони рівні, замінює одне зі значеньDecrement() Безпечно зменшує значення на 1

Exchange() Безпечно змінює два значення місцями

Increment() Безпечно зменшує значення на 1

Page 9: System programing module 3

9Andrey Gladky [email protected]

Демонстрація

Page 10: System programing module 3

10

Mutex Клас Mutex (mutual exclusion - взаємне виключення або м'ютекс) є одним з класів в .NET Framework, що дозволя’ забезпечити синхронізацію серед безлічі процесів. Він дуже схожий на клас Monitor тим, що теж допускає наявність лише одного власника. Тільки один потік може отримати блокування і мати доступ до захищених м'ютексами синхронізованим областям коду.

Andrey Gladky [email protected]

Page 11: System programing module 3

11Andrey Gladky [email protected]

Демонстрація

Page 12: System programing module 3

12

Semaphore Семафор подібний м'ютексові, за винятком того, що він надає одночасний доступ до загального ресурсу не одному, а кільком потокам. Тому семафор придатний для синхронізації цілого ряду ресурсів.

Семафор управляє доступом до загального ресурсу, використовуючи для цієї мети лічильник. Якщо значення лічильника більше нуля, то доступ до ресурсу дозволений. А якщо це значення дорівнює нулю, то доступ до ресурсу заборонений.

За допомогою лічильника ведеться підрахунок кількості дозволів. Отже, для доступу до ресурсу потік повинен отримати дозвіл від семафора.

Andrey Gladky [email protected]

Page 13: System programing module 3

13Andrey Gladky [email protected]

Демонстрація

Page 14: System programing module 3

14

Синхронізація з використанням атрибута [Synchronization]

Цей атрибут рівня класу ефективно блокує весь код екземпляра об'єкта, забезпечуючи безпеку щодо потоків. Коли середовище CLR розміщує об'єкти, забезпечені атрибутами [Synchronization], вона поміщає об'єкт в контекст синхронізації.

Об'єкти, які не повинні виходити за межі контексту, повинні успадковуватися від класу ContextBoundObject.

Andrey Gladky [email protected]

Page 15: System programing module 3

15Andrey Gladky [email protected]

Демонстрація

Page 16: System programing module 3

16

Ключові слова async і awaitКлючове слово async мови C# застосовується для вказівки на те, що метод, лямбда-вираз або анонімний метод повинні викликатися в асинхронному режимі автоматично.

Асинхронні методи використовуються для неблокуючих операцій. Вираз await в асинхронному методі не блокує поточний потік на час виконання очікуваного завдання. Замість цього вираз реєструє решту методу як продовження і повертає управління викликаючому об'єкту асинхронного методу.

Andrey Gladky [email protected]

Page 17: System programing module 3

17Andrey Gladky [email protected]

Демонстрація

Page 18: System programing module 3

18Andrey Gladky [email protected]

Page 19: System programing module 3

19

Ключові слова async і awaitСинхронний метод повертає управління, коли його робота завершується (крок 5), тоді як асинхронний метод повертає значення завдання, коли його робота припиняється (кроки 3 і 6). Коли асинхронний метод в кінцевому рахунку завершує роботу, завдання позначається як завершена і результат, при його наявності, зберігається в завданні.

Ключові слова async і await не створення додаткових потоків. Асинхронні методи не вимагають багатопоточності, оскільки асинхронний метод не виконується у власному потоці. Метод виконується в поточному контексті синхронізації і використовує час в потоці, тільки коли метод активний.

Andrey Gladky [email protected]

Page 20: System programing module 3

20

Ключові слова async і awaitЯкщо за допомогою модифікатора async вказати, що метод є асинхронним, з'являться такі дві можливості.

Асинхронний метод зможе використовувати ключове слова await для позначення точок призупинення. Оператор await повідомляє компілятору, що асинхронний метод не може виконуватися після цієї точки до завершення очікуваного асинхронного процесу. На цей час управління повертається викликаючому об'єкту асинхронного методу.

Призупинення асинхронного методу на вираженні await не є виходом з методу і блок finally не виконуються. Метод, зазначений ключовим словом async, сам може бути

очікуваним методом.

Andrey Gladky [email protected]

Page 21: System programing module 3

21Andrey Gladky [email protected]

Демонстрація