Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемМария Шугаева
1 Многопоточное программирование Синхронизация потоков Лекция 11
2 Потоки выполняются параллельно и независимо. Нельзя предсказать очередность выполнения блоков кода потоками. static void Main() { Thread t = new Thread(Write1); t.Start(); while (true) Console.Write("-"); // Все время печатать '-' } static void Write1() { while (true) Console.Write("1"); // Все время печатать '1' }
3 У каждого потока свой стек локальных переменных. Они независимые. static void Main() { new Thread(Go).Start(); // Выполнить Go() в новом потоке Go(); // Выполнить Go() в главном потоке } static void Go() { // Определяем и используем локальную переменную 'cycles' for (int cycles = 0; cycles < 5; cycles++) Console.Write('+'); }
4 Вместе с тем потоки разделяют данные, относящиеся к тому же экземпляру объекта class TestClass { bool done = false; public void Go() { if (!done) { done = true; Console.WriteLine("Done"); } } } class ThreadTest { static void Main() { TestClass testClass = new TestClass(); new Thread(testClass.Go).Start(); testClass.Go(); }
5 class Increment { decimal l = 0; public void inc() { for (int i = 0; i < ; ++i) l = l + 1; Console.WriteLine(l); } } class Program { static void Main(string[] args) { Increment i = new Increment (); for (int j = 0; j < 10; ++j) new Thread(i.inc).Start(); } }
6 Потоки выполняются параллельно и независимо. Нельзя предсказать какой поток отработает быстрее. У каждого потока свой собственный стек. Собственные неразделяемые локальные переменные Потоки разделяют нелокальные переменные, доступные им по области видимости Операции неатомарные
7 С помощью класса Interlocked Конструкция lock Класс Monitor Классы ReaderWriterLock, ReaderWriterLockSlim Класс Mutex Семафоры EventWaitHandle
8 Атомарные операции. Статические члены Interlocked.Increment Interlocked.Increment(ref i); i – long или int Interlocked.Decrement Interlocked.Decrement(ref i); i – long или int Interlocked.Add Interlocked.Add(ref i1, i2); Переменные int, long Interlocked.Exchange Interlocked.Exchange(ref i, value); Interlocked.Exchange Interlocked.Exchange (ref T i, T value); Interlocked.CompareExchange Interlocked.CompareExchange(ref i, value, compared); Если i == compared, то i = value. Переменные типов : int, long, float, double, object Interlocked.CompareExchange Interlocked.CompareExchange (ref T i, T value, T compared) – для ссылочных типов
9 Необходимо определить единую доступную всем потокам ссылочную переменную ( экземпляр объекта ) Если объект в переменной не блокирован, то поток проходит беспрепятственно через оператор lock, блокируя объект Если объект в переменной блокирован, то поток остановится на операторе lock и будет ожидать пока другой поток не выйдет из конструкции lock Например : public object lockObject = new object(); lock (lockObject) { // Операции с разделяемыми ресурсами } Каждый объект в куче имеет индекс синхронизации, который и используется для блокировок при синхронизации потоков
10 Как можно быстрее освобождать блокировку Избегать взаимоблокировок (deadlock) Блокировать только ссылочную переменную Экземпляр объекта должен быть один и тот же для всех потоков lock (B) { lock (A) { } lock (A) { lock (B) { }
11 lock
12 Monitor.Enter(lockObject); - ожидание и вход потока в критическую секцию. Увеличение количества блокировок на 1. Monitor.Exit(lockObject); - выход из критической секции. Уменьшение количества блокировок на 1. Конструкция lock реализуется через класс Monitor. Необходимо самостоятельно следить за количеством установок / снятия блокировок.
13 Очереди читателей и писателей. Много потоков могут читать данные Только один поток может захватить объект для записи. ReaderWriterLock rwl = new ReaderWriterLock(); AcquireReaderLock rwl.AcquireReaderLock(timeout); AcquireWriterLock rwl.AcquireWriterLock(timeout); UpgradeToWriterLock rwl.UpgradeToWriterLock(timeout); DowngradeFromWriterLock rwl.DowngradeFromWriterLock(ref cokie); ReleaseReaderLock rwl.ReleaseReaderLock(); ReleaseWriterLock rwl.ReleaseWriterLock();
14 Аналогичен ReaderWriterLock Короткие блокировки реализуются как инструкции Spin Но имеет еще одно доп. Состояние : Read mode Write mode Upgradeable mode ReaderWriterLockSlim sl = new ReaderWriterLockSlim(); EnterReadLock sl.EnterReadLock(); ExitReadLock sl.ExitReadLock(); EnterWriteLock sl.EnterWriteLock(); ExitWriteLock sl.ExitWriteLock(); EnterUpgradeableReadLock sl.EnterUpgradeableReadLock(); ExitUpgradeableReadLock sl.ExitUpgradeableReadLock();
15 Тяжеловесный. Уровня ОС Может использоваться для синхронизации Процессов. Mutex mutex = new Mutex(false, "MyUniqueMutex"); mutex.WaitOne(); mutex.ReleaseMutex(); mutex.Close(); Есть перегруженные методы с ограниченным временем ожидания блокировки.
16 1.Приложение, допускающее только один запущенный экземпляр приложения 2.Синхронизация процессов
17 Позволяют обеспечит доступ определенного числа потоков к разделяемым ресурсам Объект уровня ОС. Тяжеловесный Может использоваться для синхронизации Процессов. Semaphore sem = new Semaphore(initBlocks, maxBlocks, MySemaphore"); sem.WaitOne(); sem.Release(); sem.Close();
18 Синхронизация процессов
19 Наследники : AutoResetEvent AutoResetEvent ManualResetEvent ManualResetEvent Раздельно устанавливают блокировки и снимают. Один поток может ожидать, а другой по своей логике может его пропустить дальше Сообщает другому потоку, что событие произошло и тот может выполнять свои действия AutoResetEvent are = new AutoResetEvent(bool начальное состояние ); Set are.Set(); - Снимает блокировку WaitOne are.WaitOne(); - Ожидать снятия блокировки Reset are.Reset(); - Устанавливает блокировку AutoResetEvent после прохода WaitOne автоматически устанавливает блокировку (Reset). ManualResetEvent – нет.
20 Синхронизация
21 SyncRoot Некоторые коллекции содержат объект для синхронизации ( для использования с lock) – SyncRoot int[] col = new int[2]; …… lock(col.SyncRoot) { // работа с массивом } Имеются специальные коллекции, доступ к которым из разных потоков не требует синхронизации, поскольку они содержат внутренние механизмы синхронизации ConcurrentQueue ConcurrentQueue - очередь ConcurrentStack ConcurrentStack - стек ConcurrentDictionary ConcurrentDictionary - словарь ConcurrentBag ConcurrentBag - простой список
22 Работа с коллекциями
23 Process Класс Process Запуск процесса Process.Start Process.Start(…) Process process = Программка.exe"); Start process.Start(); Process process = new d:\ Программка.exe "); process.Start(); WaitForExit Ожидание завершения процесса WaitForExit() process.WaitForExit(); Process.GetProcesses Получение информации о запущенных процессах Process.GetProcesses() Process[] processes = Process.GetProcesses(); Kill Завершение процесса Kill() process.Kill();
24 Запуск и контроль другого процесса
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.