Потоки
Модуль 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). Данный класс не выполняет работы, является лишь структурой для передачи данных:
- приоритета задачи;
- набора функций подготовки (выполняются перед помещением задачи в очередь на выполнение);
- набора функций исполнения (выполняются в исполняющем потоке);
- набора функций завершения (выполняются в основном потоке);
- пользовательского объекта, ассоциированного с задачей.