Введение в многопоточность: многопоточность в C# .NET
В данной главе мы рассмотрим вопрос многопоточности и того, как она реализована в среде .NET Framework. Понимание задач и методов многопоточного программирования является очень важной темой, нуждающейся в подробном изучении для создания современных высококачественных и производительных программ.Одной из очень важных особенностей языка C# является то, что он имеет встроенную поддержку многопоточного программирования.
Особенность многопоточной программы в том, что она может состоять из нескольких частей, каждая из которых выполняет свою часть поставленной задачи. Таким образом, части выполняются параллельно. Такая часть программы называется потоком. Среда .NET Framework, в свою очередь, содержит ряд классов, предназначенный для гибкой реализации многопоточных приложений. Причем, в отличии от других языков программирования, имевших слабые места или подводные камни , встречавшиеся в процессе создания многопоточных приложений, C#, в силу своей встроенной поддержки многопоточности, позволяет полностью ликвидировать эти проблемы, или, в худшем случае, свести их к минимуму.
Многопоточность может быть ориентированная на потоки и процессы. Здесь важно понимать разницу, так как процесс, по сути, является отдельно выполняемой программной. Т.е. здесь многопоточность основана на том, что выполняются две и более программы.
Поток (по-английски - это thread, буквально можно перевести как «нить») – это управляемая единица кода, выполняемая в адресном пространстве породившего его потока. Используя многопоточность, мы можем реализовать нашу программу таким образом, чтобы один поток просчитывал графику в сцене, визуализировал ее и обновлял окно, а другой в это же самое время просчитывал физические законы, которые происходят в сцене. Или представьте другой пример: программа должна заниматься просчетом математических алгоритмов. Вычисление одного уравнения занимает 10-15 секунд. И следовательно, так как программа выполняет строки кода последовательно, до тех пор пока вычисление не будет завершено, окно приложения не будет отвечать на запросы операционной системы, оно, грубо говоря, «зависнет» на 10-15 секунд, пока не закончатся циклы математических вычислений.
Как видно из примера, ни одна современная сложная программа не может обойтись без многопоточности.
Потоки могут как выполняться, так и ожидать выполнения, быть временно приостановленными (после чего возобновленными) или заблокированными. Также поток может просто завершиться. Все это – возможные состояния потока.
Многопоточность в среде .NET Framework реализована следующим образом: существуют два типа потоков: высокоприоритетный и низкоприоритетный.
Высокоприоритетный (Foreground) поток, в отличие от низкоприоритетного (или фонового - Background), назначается как тип потока по умолчанию, а также не будет остановлен в том случае, если все высокоприоритетные потоки к его процессе будут остановлены.
Умение написания многопоточных программ сводится к тому, чтобы уметь эффективно разработать объектную модель программы, которая будет использовать в ходе решения задачи несколько отдельных потоков, а также координировать работу этих потоков между собой. Такая координация работы потоков называется синхронизацией потоков. По сути, синхронизация – это специальное средство, оснащенное собственной подсистемой методов и являющееся одной из главных составляющих многопоточного программирования.
В C# классы, отвечающие за поддержку многопоточного программирования, определены в пространстве имен System.Threading.
В следующей части главы мы рассмотрим примеры создания многопоточных приложений в среде .NET.