Статьи

Документация

Дополнительно

Потоки

Модуль stappler_threads.

Основной строительный блок для потоков: ThreadInterface. Он предоставляет функции для перегрузки:

  • threadInit - инициализация ресурсов потока
  • threadDispose - деинициализация ресурсов потока
  • worker - рабочая функция потока. Вызывается в цикле, пока не будет возвращено false.

Запуск должен выполняться с функции workerThread.

Этот строительный блок подставляет к потоку платформозависимые функции инициалиации (AutoreleasePool, JNI для Android).

Задачи

Для асинхронных задач предназначен класс thread::TaskQueue. Он реализует распределение запускаемых задач по нескольким рабочим потокам, и концентрацию функций результата в основном потоке.

Основные функции (предполагается вызов из основного потока):

  • spawnWorkers — запускает указанное количество рабочих потоков
  • cancelWorkers — завершает рабочие потоки
  • waitForAll — блокирует поток до завершения всех задач
  • performAll — комплексная операция, запускающая потоки, ожидающая завершения всех задач и завершающая потоки
  • wait — блокирует текущий поток до появления выполненных задач
  • lock — блокирует очередь, препятствуя появлению новых выполненных задач
  • unlock — деблокирует очередь
  • update — вызывает финализацию текущих выполненных задач (если есть), после чего сразу возвращает управление
  • perform — добавляет новую задачу (из любого потока)
  • onMainThread — добавляет задачу, которая сразу считается выполненной, потому ожидает завершения в основном потоке (из любого потока)

Предполагается несколько моделей использования:

  1. Единовременный вызов: очередь создаётся, в неё добавляются задачи, после чего они все выполняются с помощью performAll.
  2. Блокирующее ожидание: очередь создаётся и обрабатывает события в цикле wait, пока не случится сигнальное событие
  3. Неблокирующая очередь: очередь создаётся и обрабатывает события с некоторым периодом с помощью вызова update.

Задача в системе представлена классом Task (SPThreadTask.h). Данный класс не выполняет работы, является лишь структурой для передачи данных:

  • приоритета задачи;
  • набора функций подготовки (выполняются перед помещением задачи в очередь на выполнение);
  • набора функций исполнения (выполняются в исполняющем потоке);
  • набора функций завершения (выполняются в основном потоке);
  • пользовательского объекта, ассоциированного с задачей.