Многопоточное программирование Синхронизация потоков Лекция 11.

Презентация:



Advertisements
Похожие презентации
Многопоточное программирование ( часть 1) Лекция 10.
Advertisements

Введение в разработку многопоточных приложений. Поморгаем int main() { while(true) { EnableLedOne(); DisableLedOne(); }
Модель приложений.NET. Среда платформы Win32, в которой выполняется программа, называется ее процессом. Эта среда состоит из: адресного пространства,
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 3 Томский политехнический.
ПОТОКИ Начальные сведенияПОТОКИ Начальные сведения.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Многопоточное программирование на Java Java Advanced.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Многопоточное программирование. Виды параллелизма. Общая память Распределенная память.
Многопоточное программирование на Java Java Advanced.
Параллелизм и потоки в Java For students of university Author: Oxana Dudnik.
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
POSIX Threads. Общая модель Программа Общая память Поток 1 CPU Поток 2 Поток N Потоки – наборы инструкций, исполняющиеся на CPU. Все потоки одной программы.
СОБЫТИЯ Лекция 1. Взаимодействие объектов 2 Взаимодействие между объектами A и B можно организовать двумя способами. 1.Объект A вызывает метод объекта.
Многопоточное программирование Java Advanced. 2Georgiy Korneev Краткое содержание 1.Введение 2.Классические задачи многопоточного программирования 3.Атомарные.
Управление процессами 3.Взаимодействие процессов: синхронизация, тупики 3.1.Разделение ресурсов 3.2.Взаимное исключение Проблемы реализации взаимного.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Управление процессами Синхронизация процессов и потоков.
Высокоуровневые методы информатики и программирования Лекция 10 События.
Транксрипт:

Многопоточное программирование Синхронизация потоков Лекция 11

Потоки выполняются параллельно и независимо. Нельзя предсказать очередность выполнения блоков кода потоками. static void Main() { Thread t = new Thread(Write1); t.Start(); while (true) Console.Write("-"); // Все время печатать '-' } static void Write1() { while (true) Console.Write("1"); // Все время печатать '1' }

У каждого потока свой стек локальных переменных. Они независимые. static void Main() { new Thread(Go).Start(); // Выполнить Go() в новом потоке Go(); // Выполнить Go() в главном потоке } static void Go() { // Определяем и используем локальную переменную 'cycles' for (int cycles = 0; cycles < 5; cycles++) Console.Write('+'); }

Вместе с тем потоки разделяют данные, относящиеся к тому же экземпляру объекта 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(); }

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(); } }

Потоки выполняются параллельно и независимо. Нельзя предсказать какой поток отработает быстрее. У каждого потока свой собственный стек. Собственные неразделяемые локальные переменные Потоки разделяют нелокальные переменные, доступные им по области видимости Операции неатомарные

С помощью класса Interlocked Конструкция lock Класс Monitor Классы ReaderWriterLock, ReaderWriterLockSlim Класс Mutex Семафоры EventWaitHandle

Атомарные операции. Статические члены 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) – для ссылочных типов

Необходимо определить единую доступную всем потокам ссылочную переменную ( экземпляр объекта ) Если объект в переменной не блокирован, то поток проходит беспрепятственно через оператор lock, блокируя объект Если объект в переменной блокирован, то поток остановится на операторе lock и будет ожидать пока другой поток не выйдет из конструкции lock Например : public object lockObject = new object(); lock (lockObject) { // Операции с разделяемыми ресурсами } Каждый объект в куче имеет индекс синхронизации, который и используется для блокировок при синхронизации потоков

Как можно быстрее освобождать блокировку Избегать взаимоблокировок (deadlock) Блокировать только ссылочную переменную Экземпляр объекта должен быть один и тот же для всех потоков lock (B) { lock (A) { } lock (A) { lock (B) { }

lock

Monitor.Enter(lockObject); - ожидание и вход потока в критическую секцию. Увеличение количества блокировок на 1. Monitor.Exit(lockObject); - выход из критической секции. Уменьшение количества блокировок на 1. Конструкция lock реализуется через класс Monitor. Необходимо самостоятельно следить за количеством установок / снятия блокировок.

Очереди читателей и писателей. Много потоков могут читать данные Только один поток может захватить объект для записи. 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();

Аналогичен 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();

Тяжеловесный. Уровня ОС Может использоваться для синхронизации Процессов. Mutex mutex = new Mutex(false, "MyUniqueMutex"); mutex.WaitOne(); mutex.ReleaseMutex(); mutex.Close(); Есть перегруженные методы с ограниченным временем ожидания блокировки.

1.Приложение, допускающее только один запущенный экземпляр приложения 2.Синхронизация процессов

Позволяют обеспечит доступ определенного числа потоков к разделяемым ресурсам Объект уровня ОС. Тяжеловесный Может использоваться для синхронизации Процессов. Semaphore sem = new Semaphore(initBlocks, maxBlocks, MySemaphore"); sem.WaitOne(); sem.Release(); sem.Close();

Синхронизация процессов

Наследники : AutoResetEvent AutoResetEvent ManualResetEvent ManualResetEvent Раздельно устанавливают блокировки и снимают. Один поток может ожидать, а другой по своей логике может его пропустить дальше Сообщает другому потоку, что событие произошло и тот может выполнять свои действия AutoResetEvent are = new AutoResetEvent(bool начальное состояние ); Set are.Set(); - Снимает блокировку WaitOne are.WaitOne(); - Ожидать снятия блокировки Reset are.Reset(); - Устанавливает блокировку AutoResetEvent после прохода WaitOne автоматически устанавливает блокировку (Reset). ManualResetEvent – нет.

Синхронизация

SyncRoot Некоторые коллекции содержат объект для синхронизации ( для использования с lock) – SyncRoot int[] col = new int[2]; …… lock(col.SyncRoot) { // работа с массивом } Имеются специальные коллекции, доступ к которым из разных потоков не требует синхронизации, поскольку они содержат внутренние механизмы синхронизации ConcurrentQueue ConcurrentQueue - очередь ConcurrentStack ConcurrentStack - стек ConcurrentDictionary ConcurrentDictionary - словарь ConcurrentBag ConcurrentBag - простой список

Работа с коллекциями

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();

Запуск и контроль другого процесса