Багатопотоковість і синхронізація
Навіщо потрібні потоки
Асинхронні делегати
Дескриптор очікування Асинхронний зворотній виклик
Клас Thread. Передавання даних потокам
Оновлення інтерфейсу користувача з асинхронного потоку
Пули потоків ThreadPool
Засоби синхронізації потоків одного процесу
Проблеми багатопотоковості
Засоби синхронізації процесів
На самостійне вивчення
122.00K
Category: programmingprogramming

Багатопотоковість і синхронізація. (Лекція 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 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 { // блокування отримати не вдалося }
8 / 11

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

“Гонки” – змагання за один ресурс
несинхронізованих потоків
Блокування ресурсу на час доступу
на рівні самого ресурсу
на рівні звертання до ресурсу
“Тупики” – взаємне блокування як наслідок
очікування на завершення роботи
ліміти часу на очікування зняття блокувань
9 / 11

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

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

11. На самостійне вивчення

Задачі (task) – новий рівень абстракції
потоків (.Net 4.0)
Багатопотокові обчислення за допомогою
класу Parallel (.Net 4.0)
11 / 11
English     Русский Rules