Similar presentations:
Багатопотоковість і синхронізація. (Лекція 10)
1. Багатопотоковість і синхронізація
асинхронні делегати; Thread;пул потоків; синхронізація;
таймери; асинхронна модель
на базі подій
2. Навіщо потрібні потоки
Потік – незалежна послідовність інструкцій, що отримує часпроцесора
Багатопотоковість – спосіб “поділу обов’язків”
Процес == ресурси + пам’ять + потік(и)
системна охорона адресного простору
міжпроцесна взаємодія – через ОС
Потік має власний стек для локальних змінних, використовує
спільні код і купу
окремий потік для довготривалої задачі
різні потоки для різних ядер процесора
спільна пам’ять – проста взаємодія між потоками
Потреби синхронізації потоків
2 / 11
3. Асинхронні делегати
Створення делегата, виклик асинхронним чиномint TakesAWhile(int data, int ms, char c) //”тривалий”метод
// тип делегата і екземпляр делегата
delegate int TakesAWhileDelegate(int data, int ms, char c);
TakesAWhileDelegate d = TakesAWhile;
// “контрольований” асинхронний виклик
// IAsyncresult BeginInvoke(<Params>, AsyncCallback, object);
IAsyncresult ar = d.BeginInvoke(counter, 3000, '.', null, null);
Очікування завершення та отримання результату
while ( !ar.IsCompleted ) …// паралельне виконання ще чогось
//MethodResultType EndInvoke(IAsyncResult ar);
result = d.EndInvoke(ar); // також очікує, якщо потік ще працює
3 / 11
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(<params>, MetodOrLambda, objectForMethod)
4 / 11
5. Клас Thread. Передавання даних потокам
Створювати і керуватиСтворені потоки – пріоритетні
Метод з параметром
delegate void ThreadStart();
tread = new Thread(aMethodName)
лямбда-вираз замість методу
tread.Start(); Name, Priority …
Thread.Sleep(ms), Abort(), ResetAbort(), …
delegate void ParametrizedThreadStart(object);
Клас з даними і методом, що стане методом
потоку
5 / 11
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" });
}
6 / 11
7. Пули потоків ThreadPool
Створення потоку – затрати часу ==> колекціяпотоків створених завчасу
Автоматичне налаштування кількості потоків
Постановка в чергу завдань за відсутності
вільних потоків
Обмеження:
всі потоки фонові
змінювати пріоритет чи ім’я потоку не можна
потоки для короткотривалих завдань
7 / 11
8. Засоби синхронізації потоків одного процесу
lock(anObject) // thread-safe resourcesk++; //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 { // блокування отримати не вдалося }
8 / 11
9. Проблеми багатопотоковості
“Гонки” – змагання за один ресурснесинхронізованих потоків
Блокування ресурсу на час доступу
на рівні самого ресурсу
на рівні звертання до ресурсу
“Тупики” – взаємне блокування як наслідок
очікування на завершення роботи
ліміти часу на очікування зняття блокувань
9 / 11
10. Засоби синхронізації процесів
WaitHandleMutex
Semaphore
Event
ReaderWriterLockSlim
Таймери
Шаблон BackgroundWorker
10 / 11
11. На самостійне вивчення
Задачі (task) – новий рівень абстракціїпотоків (.Net 4.0)
Багатопотокові обчислення за допомогою
класу Parallel (.Net 4.0)
11 / 11