На этом шаге мы начнем знакомство с потоками.
Поток - это объект операционной системы, получающий время процессора, заключенный в процесс и реализующий какую-либо задачу. Время процессора выделяется так называемыми квантами. Квант - это интервал времени, в течение которого поток будет выполняться, пока время не будет передано другому потоку.
Не следует путать потоки с процессами. Процесс состоит из виртуальной памяти, исполняемого кода, потоков и данных, причем каждый процесс имеет хотя бы один поток: главный поток приложения. И время процессора разделяется именно между потоками, а не процессами. Каждый поток работает в адресном пространстве процесса, в который он заключен, и имеет доступ к его глобальным переменным.
Количество процессорного времени, выделяемое потоку на выполнение и то, как часто поток будет получать это время, зависит от приоритета потока (о приоритетах потоков подробнее будет сказано на следующем шаге).
Вопрос об использовании потоков стал актуален, когда операционные системы стали поддерживать многопоточность (многозадачность). Благодаря именно многопоточности, мы имеем возможность запускать одновременно несколько приложений, работающих "параллельно". Слово "параллельно" неслучайно взято в кавычки. На самом деле реальную параллельность выполнения приложений, а конкретнее потоков, мы можем получить только в случае использования двух и более процессоров. В случае же использования одного процессора уместнее говорить о псевдопараллельности. Созданные потоки разделяют между собой самый важный ресурс - время процессора, поэтому использование потоков в приложении не сделает его работу быстрее, скорее наоборот, большое количество потоков ее замедлит, т.к. определенное время будет затрачено процессором на переключение между потоками.
С помощью создания дополнительных потоков в приложении можно решать различные задачи. Например, организация фоновых процедур в приложении. Часто требуется решать задачи, связанные с длительными вычислениями, либо с постоянно повторяющимися действиями (например, опрос порта на наличие устройства), и не требующие наибыстрейшего выполнения. Чтобы процедуры, решающие подобные задачи, не затормаживали работу приложения, их можно помещать в отдельные потоки с низким приоритетом. Также можно (в определенном смысле) оптимизировать скорость выполнения приложения, за счет помещения различных процедур в различные потоки и назначения им разных приоритетов. Для процедур, требующих наискорейшего выполнения, назначается высокий приоритет и наоборот.
Следующий шаг будет посвящен приоритетам потоков.