# Thread (Поток)

## История

Потоки POSIX

В конце 1980-х и начале 1990-х было несколько разных API, но в 1995 г. POSIX.1c стандартизовал потоки POSIX, позже это стало частью спецификаций SUSv3. В наше время многоядерные процессоры проникли даже в настольные ПК и смартфоны, так что даже у большинства машин есть низкоуровневая аппаратная поддержка, позволяющая им одновременно выполнять несколько потоков. В былые времена одновременное исполнение потоков на одноядерных ЦПУ было лишь впечатляюще изобретательной, но очень эффективной иллюзией.

## Поток

Поток можно считать меньшей единицей выполнения приложения. Каждому приложению принадлежит минимум один поток, который называется основным (main thread). Этот поток запускается [операционной системой](/2%20ComputerScience/2.0%20Linux/2.0.1%20Linux.md), когда вызывается метод main() приложения; это происходит при старте приложения. Заметьте, что более-менее одно и то же происходит на всех поддерживаемых платформах — как работающих на мощных компьютерах, так и на устройствах под управлением Windows Phone с ограниченными вычислительными ресурсами.

При вызове какого-либо метода операция добавляется в очередь. Каждая операция выполняется последовательно, в соответствии с порядком, в котором она была добавлена в очередь (хотя на порядок выполнения операций можно повлиять, назначив им приоритеты).

Все потоки разделяют общие ресурсы потока (память, файловые дескрипторы, процессорное время). У каждого потока есть свой [стэк](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.2%20RandomAccessMemory/3.1.2.2%20Stack.md) (областья [память](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.1%20AboutMemory/3.1.1.1%20Memory.md), куда сохраняются локальные переменные функции, пока эта функция сохраняется). 

Управление потоками необходимо чтобы: 
1) сделать приложение быстрым, предотвратить зависающий UI, реагировать на действия пользователей без задержки; 
2) параллельно (сconcurrent) обрабатывать данные; 

> ❗ В однопоточном процессоре каждое ядро обрабатывает только один поток данных.
>
> Hyper-Threading (HT) — это технология Intel, позволяет 1му физическому ядру обрабатывать два потока данных одновременно. Достигается за счет создания двух виртуальных (логических) ядер на базе одного физического.

![Processor_Core](/pictures/Memory/CPUwithCernel.jpg?raw=true)

При написании многопоточных (multithreading) приложений требуется работать с общими данными из разных потоков. 

### Thread в ОСях

> Posix Threads или Pthreads определяет набор типов и функций на Си.

Pthreads - самый низкий уровень управления потоками, доступные в приложении. Он дает почти прямой доступ к управлению потоками ядра OS. В swift эта билиотека обычно не используется из-за сложности и необходимости работы с указателями. 

iOS SDK дает более простой способ управления потоками - `class Thread`. 

```swift
let thread = Thread {
  // вычисления
}
thread.start()
```

> Объект, отвечающий за управление очередью, называется **диспетчером потока** (thread’s dispatcher). Н/р: GCD

### Threads in Xcode

Во время отладки существуют [встроенные команды](https://codeswift.ru/wp-content/uploads/2022/02/12.png) упрощающие понимание деталей текущего потока. 

```swift
// команды для печати
po Thread.isMainThread
po Thread.isMultiThreaded()
po Thread.current
po Thread.main
```


---

[2.0.4.1 Process Theme](./2.0.4.1%20Process.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) |  [2.1 Algoritms Theme Folder](/2%20ComputerScience/2.1%20Algoritms/)
