Потоки
Модуль stappler_threads
.
Основной строительный блок для потоков: ThreadInterface
. Он предоставляет функции для перегрузки:
threadInit
- инициализация ресурсов потокаthreadDispose
- деинициализация ресурсов потокаworker
- рабочая функция потока. Вызывается в цикле, пока не будет возвращено false.
Запуск должен выполняться с функции workerThread
.
Этот строительный блок подставляет к потоку платформозависимые функции инициалиации (AutoreleasePool
, JNI для Android).
Задачи
Для асинхронных задач предназначен класс thread::TaskQueue
. Он реализует распределение запускаемых задач по нескольким рабочим потокам, и концентрацию функций результата в основном потоке.
Основные функции (предполагается вызов из основного потока):
spawnWorkers
— запускает указанное количество рабочих потоковcancelWorkers
— завершает рабочие потокиwaitForAll
— блокирует поток до завершения всех задачperformAll
— комплексная операция, запускающая потоки, ожидающая завершения всех задач и завершающая потокиwait
— блокирует текущий поток до появления выполненных задачlock
— блокирует очередь, препятствуя появлению новых выполненных задачunlock
— деблокирует очередьupdate
— вызывает финализацию текущих выполненных задач (если есть), после чего сразу возвращает управлениеperform
— добавляет новую задачу (из любого потока)onMainThread
— добавляет задачу, которая сразу считается выполненной, потому ожидает завершения в основном потоке (из любого потока)
Предполагается несколько моделей использования:
- Единовременный вызов: очередь создаётся, в неё добавляются задачи, после чего они все выполняются с помощью
performAll
. - Блокирующее ожидание: очередь создаётся и обрабатывает события в цикле
wait
, пока не случится сигнальное событие - Неблокирующая очередь: очередь создаётся и обрабатывает события с некоторым периодом с помощью вызова
update
.
Задача в системе представлена классом Task
(SPThreadTask.h
). Данный класс не выполняет работы, является лишь структурой для передачи данных:
- приоритета задачи;
- набора функций подготовки (выполняются перед помещением задачи в очередь на выполнение);
- набора функций исполнения (выполняются в исполняющем потоке);
- набора функций завершения (выполняются в основном потоке);
- пользовательского объекта, ассоциированного с задачей.