Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Многопоточность.doc
Скачиваний:
4
Добавлен:
28.10.2018
Размер:
225.79 Кб
Скачать

Многопоточность

Якимов И.М.

Данная статья описывает реализацию и использование многопоточности в среде .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. Если загрузить поток интерфейса какой-либо задачей, то окна перестанут отрисовываться.

Какие же требования обычно предъявляются к механизмам, обеспечивающим поддержку многопоточности в языке программирования?

  1. Конечно же необходимы простые средства создания отдельных потоков кода.

  2. Во-первых, нам необходимо знать, когда поток завершил свою работу. Необходимы механизмы, позволяющие подождать, пока поток не завершит свое выполнение.

  3. Иногда требуется отменить выполнение задачи, которую исполняет поток.

  4. Иногда необходимо приостановить исполнение потока, например, чтобы освободить используемые им вычислительные ресурсы.

  5. Необходимы механизмы, позволяющие синхронизировать доступ нескольких потоков к различным ресурсам.

Далее мы рассмотрим, как реализуются эти и другие связанные с потоками задачи на платформе .NET.