Багатопотоковість і синхронізація. (Лекція 10)

Содержание

Слайд 2

Навіщо потрібні потоки Потік – незалежна послідовність інструкцій, що отримує час

Навіщо потрібні потоки

Потік – незалежна послідовність інструкцій, що отримує час процесора
Багатопотоковість

– спосіб “поділу обов’язків”
окремий потік для довготривалої задачі
різні потоки для різних ядер процесора
Процес == ресурси + пам’ять + потік(и)
системна охорона адресного простору
міжпроцесна взаємодія – через ОС
Потік має власний стек для локальних змінних, використовує спільні код і купу
спільна пам’ять – проста взаємодія між потоками
Потреби синхронізації потоків
Слайд 3

Асинхронні делегати Створення делегата, виклик асинхронним чином int TakesAWhile(int data, int

Асинхронні делегати

Створення делегата, виклик асинхронним чином
int TakesAWhile(int data, int ms, char

c) //”тривалий”метод
// тип делегата і екземпляр делегата delegate int TakesAWhileDelegate(int data, int ms, char c); TakesAWhileDelegate d = TakesAWhile;
// “контрольований” асинхронний виклик // IAsyncresult BeginInvoke(, AsyncCallback, object); IAsyncresult ar = d.BeginInvoke(counter, 3000, '.', null, null);
Очікування завершення та отримання результату
while ( !ar.IsCompleted ) …// паралельне виконання ще чогось
//MethodResultType EndInvoke(IAsyncResult ar); result = d.EndInvoke(ar); // також очікує, якщо потік ще працює
Слайд 4

Дескриптор очікування Асинхронний зворотній виклик Альтернативний спосіб реалізації очікування З об’єктом

Дескриптор очікування Асинхронний зворотній виклик

Альтернативний спосіб реалізації очікування
З об’єктом IAsyncResult асоційовано

дескриптор WaitHandle (приховує системний об’єкт синхронізації)
property AsyncWaitHandle
bool WaitOne(int Timeout) // метод(и) “присипляє” потік
Результат залежить від того, чи завершився потік впродовж Timeout мілісекунд
“Запустити і забути”
void AsyncCallback(IAsyncresult ar); // тип делегата void TakesAWhileCompleted(IAsyncResult ar) // метод
d.Beginlnvoke(counter, 3000, TakesAWhileCompleted, obj); //Beginlnvoke(, MetodOrLambda, objectForMethod)
Слайд 5

Клас Thread. Передавання даних потокам Створювати і керувати delegate void ThreadStart();

Клас Thread. Передавання даних потокам

Створювати і керувати
delegate void ThreadStart();
tread = new Thread(aMethodName)
лямбда-вираз

замість методу
tread.Start(); Name, Priority …
Thread.Sleep(ms), Abort(), ResetAbort(), …
Створені потоки – пріоритетні
Метод з параметром
delegate void ParametrizedThreadStart(object);
Клас з даними і методом, що стане методом потоку
Слайд 6

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

Оновлення інтерфейсу користувача з асинхронного потоку

Оновлювати інтерфейс можна тільки в тому

потоці, який його створив
// тип делегата для методу, що оновлюватиме вікно delegate void SetTextCallback(string text);
void ChangeName(string name) // сам метод
// створення і запуск потоку thread = new Thread(new ThreadStart(DoWork)); thread.Start();
// оновлення вікна, виклик в тілі DoWork if (this.control.InvokeRequired) { this.Invoke(new SetTextCallback(ChangeName), new object[] {" New Text by Invoke" }); }
Слайд 7

Пули потоків ThreadPool Створення потоку – затрати часу ==> колекція потоків

Пули потоків ThreadPool

Створення потоку – затрати часу ==> колекція потоків створених

завчасу
Автоматичне налаштування кількості потоків
Постановка в чергу завдань за відсутності вільних потоків
Обмеження:
всі потоки фонові
змінювати пріоритет чи ім’я потоку не можна
потоки для короткотривалих завдань
Слайд 8

Засоби синхронізації потоків одного процесу lock(anObject) // thread-safe resources k++; //thread-unsafe

Засоби синхронізації потоків одного процесу

lock(anObject) // thread-safe resources
k++; //thread-unsafe operation
Interlocked.Operation(anObject)
Increment(), Decrement(),

Exchange(), Add(), …
Monitor: lock(anObj) ? Monitor.Enter(anObj)
bool lockTaken = false; Monitor.TryEnter (obj, 500, ref lockTaken); if (lockTaken) { try { // синхронизирована область для obj } finally { Monitor.Exit (obj); } } else { // блокування отримати не вдалося }
Слайд 9

Проблеми багатопотоковості “Гонки” – змагання за один ресурс несинхронізованих потоків Блокування

Проблеми багатопотоковості

“Гонки” – змагання за один ресурс несинхронізованих потоків
Блокування ресурсу на

час доступу
на рівні самого ресурсу
на рівні звертання до ресурсу
“Тупики” – взаємне блокування як наслідок очікування на завершення роботи
ліміти часу на очікування зняття блокувань
Слайд 10

Засоби синхронізації процесів WaitHandle Mutex Semaphore Event ReaderWriterLockSlim Таймери Шаблон BackgroundWorker

Засоби синхронізації процесів

WaitHandle
Mutex
Semaphore
Event
ReaderWriterLockSlim
Таймери
Шаблон BackgroundWorker