Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемАнгелина Селиванова
1 Введение в разработку многопоточных приложений
3 Поморгаем int main() { while(true) { EnableLedOne(); DisableLedOne(); }
4 Поморгаем int Delay(int ms) { for(int i = 0; i < ms * k ; i++){} } int main() { while(true) { EnableLedOne(); Delay(300); DisableLedOne(); Delay(900); }
5 Одна лампочка t(мс)
7 Две лампочки t(мс)
8 Две лампочки t(мс) мс
9 Очередь заданий Task1, через 50мс Task2, через 100мс Task1, сейчас Task2, через 50мс Task2, сейчас t(мс)
10 Поморгаем с планировщиком void EnableLedOneTask() { EnableLedOne(); RegisterDelayedTask(DisableLedOneTask, 300); } void DisableLedOneTask() { DisableLedOne(); RegisterDelayedTask(EnableLedOneTask, 900); } int main() { RegisterDelayedTask(EnableLedOneTask, 0); RegisterDelayedTask(EnableLedTwoTask, 0); while(true) { Delay(50); ExecuteTaskByTime(); }
11 Sleep void LedOne () { while(true) { EnableLedOne(); Sleep(300); DisableLedOne(); Sleep(600); }
12 Sleep void LedOneThread() { B202 while(true) B203 { B204 EnableLedOne(); B205 Sleep(300); B207 DisableLedOne(); B208 Sleep(600); B209 } }
13 Sleep void LedOneThread() { int i = GetOnTime(); int j = GetOffTime(); while(true) { EnableLedOne(); Sleep(i); DisableLedOne(); Sleep(j); }
14 Стек и регистры j Регистры Стек i
15 Стек и регистры j Регистры Стек g h
16 Стеки и регистры Регистры i j Стек потока 1 i
17 Стеки и регистры Регистры Стек потока 2 g h j Стек потока 1 i g
18 Поток Физически – процедура потока, служебные данные и стек Логически – виртуальный процессор
19 Типы многопоточности Sleep() Поток 1Поток 2 t t
20 Типы многопоточности Кванты Sleep() Поток 1Поток 2 t t Квант кончился
21 Создание потоков WinAPI: CreateThread/TerminateThread.NET: class Thread static void Main(string[] args) { Thread thread = new Thread(DoA); thread.Start(); } static void DoA() { … }
22 Пул потоков WinAPI: QueueUserWorkItem.NET: class ThreadPool static void Main(string[] args) { ThreadPool.QueueUserWorkItem(DoA); } static void DoA(object state) { }
25 GUI void OnClick() { ThreadPool.QueueUserWorkItem(DoA); } void DoA(object state) { resultTextBox.Text = ComputeSmth(); }
26 GUI Очередь сообщений Поток окна Перерисуй окно Кликнули мышкой
27 GUI Очередь сообщений Поток окна Перерисуй окно Кликнули мышкой Обработай окончание вычисления
28 GUI static void DoA(object state) { _result = ComputeSmth(); resultTextBox.BeginInvoke(SetResult); } static void SetResult (object state) { resultTextBox.Text = _result; }
30 Проблемы многопоточности Проблемы корректности Проблемы живучести
31 Состояние гонки _i++; MOV EAX, [_ i ] INC EAX MOV [ _i ], EAX
32 «Одновременное» выполнение Поток 1 MOV EAX, [ i ] INC EAX MOV [ i ], EAX Поток 2 MOV EAX, [ i ] INC EAX MOV [ i ], EAX t
33 Многопроцессорная машина Процессор 1Процессор 2 Память Кэш 1Кэш 2 i = 2 i = 3
34 Многопроцессорная машина Процессор 1Процессор 2 Память Кэш 1Кэш 2 i = 2 i = 3 Когерентность кэша
35 Последовательное выполнение Поток 1 Enter() MOV EAX, [ i ] INC EAX MOV [ i ], EAX Exit() Поток 2 Enter() INC EAX MOV EAX, [ i ] MOV [ i ], EAX t
36 Критический регион … EnterCriticalRegion() _i++; LeaveCriticalRegion() …
37 Критический регион int taken = 0; void EnterCriticalRegion() { while(taken != 0) {} taken = 1; } void LeaveCriticalRegion() { taken = 0; }
39 Строгое чередование const int N = 2; int turn = 0; void EnterCriticalRegion (int i) { while (turn != i ) {} } void LeaveCriticalRegion (int i) { turn = (i + 1) % N; }
40 Алгоритм Петерсона(1981) bool flags[2]; int turn = 0; void EnterCriticalRegion (int i) { flags [ i ] = true ; turn = 1 - i ; while ( flags[1 - i] && turn != i ) {} } void LeaveCriticalRegion (int i) { flags [i] = false; }
41 CAS long CompareExchange(long *Destination, long Exchange, long Comparand); int taken = 0; void EnterCriticalRegion() { while( CompareExchange((&taken,1, 0)) {} } void LeaveCriticalRegion() { taken = 0; }
42 Interlocked Interlocked.Increment(ref _i);
43 Mutex static Mutex _mutex = new Mutex(); static void DoA(object state) { _mutex.WaitOne(); _i++; _mutex.ReleaseMutex(); }
44 Monitor void EnterCriticalRegion() { for(int i = 0; i < 1000 && ! CompareExchange((&taken,1, 0)) ; i++) {} if(taken == 0) { _mutex.WaitOne(); }
45 Monitor private static object _lockObject; static void DoA(object state) { lock(_lockObject) { ThreadUnsafeOperation(); } WinAPI: EnterCriticalSection/LeaveCriticalSection
46 Неблокирующая синхронизация
47 Фокус flags[i] = true; turn = 1 - i; while (flags[1 - i] && turn != i) { }
48 Фокус flags[i] = true; turn = 1 - i; int tmp1 = flags[1 - i] int tmp2 = turn != I …
49 Фокус flags[i] = true; int tmp1 = flags[1 - i] …
50 Фокус CPU1 flags[0] = true; int tmp1 = flags[1] … CPU2 flags[1] = true; int tmp1 = flags[0] …
51 Фокус CPU1 flags[0] = true; int tmp1 = flags[1] … CPU2 flags[1] = true; int tmp1 = flags[0] …
52 Многопроцессорная машина Процессор 1Процессор 2 Память Кэш 1Кэш 2 flags[0] = true flags[1] = true flags[0]=0 flags[1]=0 flags[0]=0 flags[1]=0
53 Фокус int tmp1 = flags[1 - i] flags[i] = true; …
54 Memory barrier flags[i] = true; Thread.MemoryBarrier(); int tmp1 = flags[1 - i] …
55 lock flags[i] = true; turn = 1 - i; lock (_object) { while (flags[1 - i] && turn != i) { }
57 Deadlock public static void Transfer(BankAccount a, BankAccount b, decimal amount) { lock (a) { if (a.m_balance < amount) throw new Exception("Insufficient funds."); lock (b) { a.m_balance -= amount; b.m_balance += amount; }
58 Deadlock Поток 1Поток 2 Lock(счет1)Lock(счет2) Lock(счет1) t
59 Банковский алгоритм public static void Transfer(BankAccount a, BankAccount b, decimal amount) { LockManager.LockAccounts(a, b) if (a.m_balance < amount) throw new Exception("Insufficient funds."); a.m_balance -= amount; b.m_balance += amount; }
60 Сортировка Поток 1Поток 2 Lock(счет1) Lock(счет2) Lock(счет1) Lock(счет2) t
61 Что почитать Concurrent Programming on Windows (Joe Duffy) CLR via C# (Jeffrey Richter ) Memory Barriers: a Hardware View for Software Hackers
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.