- •Многопоточность
- •Оглавление
- •Задачи многопоточности
- •Методы создания потоков
- •Делегаты
- •Ожидание завершения работы потока
- •Получение результата работы метода, выполнявшегося в отдельном потоке
- •Класс Thread
- •Ожидание завершения потока
- •Управление выполнением потока
- •«Сон» потока
- •Приоритет потоков
- •Фоновые потоки и потоки «переднего плана»
- •Класс ThreadPool
- •Синхронизация потоков
- •Оператор lock
- •Класс ReaderWriterLock
- •Класс Mutex
- •Класс WaitHandle
- •Класс AutoResetEvent
- •Класс ManualResetEvent
- •Блокировка потоков
- •Взаимодествие с пользовательским интерфейсом
- •Метод Invoke
- •Использование SynchronizationContext
- •Класс BackgroundWorker
- •Окончание работы и возвращение результата
- •Прогресс выполнения
- •Отмена выполнения метода
- •Объект Dispatcher
- •Класс BackgroundWorker
- •Заключение
Многопоточность
Якимов И.М.
Данная статья описывает реализацию и использование многопоточности в среде .NET Framework.
Оглавление
Многопоточность 1
Оглавление 1
Задачи многопоточности 2
Методы создания потоков 3
Делегаты 3
Ожидание завершения работы потока 4
Получение результата работы метода, выполнявшегося в отдельном потоке 5
Класс Thread 6
Ожидание завершения потока 7
Управление выполнением потока 8
«Сон» потока 9
Приоритет потоков 9
Фоновые потоки и потоки «переднего плана» 10
Класс ThreadPool 10
Синхронизация потоков 12
Оператор lock 12
Класс ReaderWriterLock 14
Класс Mutex 15
Класс WaitHandle 16
Класс AutoResetEvent 17
Класс ManualResetEvent 19
Блокировка потоков 19
Взаимодествие с пользовательским интерфейсом 21
WinForms 21
Метод Invoke 21
Использование SynchronizationContext 22
Класс BackgroundWorker 23
WPF 25
Объект Dispatcher 26
Класс BackgroundWorker 26
Заключение 26
Задачи многопоточности
Многопоточность представляет собой возможность выполнять несколько кусков кода «параллельно». Слово параллельно заключено в кавычки потому, что на самом деле процессор компьютера способен одновременно выполнять только одну инструкцию. Поэтому в каждый момент времени на нем выполняется только один поток. Соответственно двухъядерный процессор способен одновременно выполнять 2 потока и т.д.
Каким же образом тогда реализуется многопоточность? Операционная система поддерживает список активных потоков. В очередной момент времени она выбирает из него один поток и передает ему управление на время, называемое квантом времени. В течении этого времени код данного потока выполняется процессором. Затем операционная система принудительно останавливает этот поток и сохраняет содержимое регистров процессора и другую необходимую потоку для нормальной работы информацию в области памяти, называемой контекстом потока. Затем операционная система выбирает из списка потоков другой активный поток, загружает его контекст потока и передает этому потоку управление на следующий квант времени. Такая техника, когда операционная система сама следит за распределением времени между потоками, прерывая их в случае необходимости, называется вытесняющей многозадачностью.
Какой же вывод можно сделать из этой системы реализации многозадачности. Операционная система тратит время на остановку потока, сохранение его контекста, выбор нового потока и загрузку его контекста. Чем больше в системе потоков, тем больше накладные расходы на эти операции. Поэтому несколько потоков всегда выполняются медленнее, чем один поток.
Так какие же преимущества дает нам многопоточность в этом случае? Она не ускоряет работу, она сокращает время отклика системы. Если вы хотите выполнить какую-то длительную операцию, то выполнение ее в том же потоке, в котором происходит взаимодействие с пользователем (потоке пользовательского интерфейса) приведет к «зависанию» системы. Т.е. до тех пор, пока задача не будет выполнена, система не будет реагировать на действия пользователя (программа ThreadingSingleThreadBlocking). Если же вы выполняете данную длительную задачу в отдельном потоке, то за счет того, что операционная система время от времени передает управление потоку пользовательского интерфейса, он имеет возможность обрабатывать действия пользователя. Особенно это важно при работе с оконным интерфейсом Windows. Если загрузить поток интерфейса какой-либо задачей, то окна перестанут отрисовываться.
Какие же требования обычно предъявляются к механизмам, обеспечивающим поддержку многопоточности в языке программирования?
-
Конечно же необходимы простые средства создания отдельных потоков кода.
-
Во-первых, нам необходимо знать, когда поток завершил свою работу. Необходимы механизмы, позволяющие подождать, пока поток не завершит свое выполнение.
-
Иногда требуется отменить выполнение задачи, которую исполняет поток.
-
Иногда необходимо приостановить исполнение потока, например, чтобы освободить используемые им вычислительные ресурсы.
-
Необходимы механизмы, позволяющие синхронизировать доступ нескольких потоков к различным ресурсам.
Далее мы рассмотрим, как реализуются эти и другие связанные с потоками задачи на платформе .NET.