Я пытаюсь выяснить модель планирования в C ++ версия Rx.
Зная версию C #, где есть простой интерфейс с одним методом Schedule; Версия C ++ кажется довольно сложной, с такими вещами, как планировщик, работник и координация.
Один из основных недостатков для меня — это реализация планировщика пула потоков, существует ли он с другим именем? Как бы я реализовал это сам? Должен ли я написать это выше PPL (Windows)? Что мне нужно использовать, если над ним нужен сериализованный (как актер) наблюдатель? Заглянув Вот а также Вот Можно показать, что это не тривиальная задача.
Это действительно помогло бы получить некоторый обзор предмета, так как официальный документация генерируется автоматически и все еще очень скудна.
Да, сгенерированные документы являются новыми, а планирование еще не задокументировано.
Планировщик в rxcpp v2 основан на планировщике и рабочих конструкциях, которые использует RxJava (участвовал Эрик Мейер)
Документы для RxJava будут содержать пояснения для планировщика и работника. rxcpp добавляет планируемость, координацию и координатор.
scheduler
владеет временной шкалой, которая раскрывается now()
метод. scheduler
также фабрика для worker
в этот срок. Поскольку планировщик владеет временной шкалой, можно создавать планировщики, которые перемещаются во времени. Виртуальный планировщик является базой для планировщика тестов, который использует его для завершения мультисекундных тестов за мс.
worker
владеет очередью ожидания schedulable
s для временной шкалы и имеет срок службы. когда время для schedulable
достигнуто schedulable
это запустить. Очередь поддерживает порядок вставки, так что когда N schedulable
у них одинаковое целевое время, когда они выполняются в том порядке, в котором они были вставлены в очередь. worker
гарантирует, что каждый schedulable
завершается до следующего schedulable
запущен когда worker
Отписано все в ожидании schedulable
с отбрасываются.
schedulable
владеет функцией и имеет работника и всю жизнь. когда schedulable
отписался schedulable
функция не будет вызвана. schedulable
передается в функцию и позволяет функции перепланировать себя или запланировать что-то еще на том же рабочем месте.
Новые понятия — координация и координатор. Я добавил их, чтобы упростить реализацию операторов и ввести плату за использование в реализациях операторов. В частности, в Rx.NET и RxJava операторы используют атомарные операции и примитивы синхронизации для координации сообщений из нескольких потоков, даже когда все потоки находятся в одном потоке (например, события пользовательского интерфейса). identity_. . .
координаты в rxcpp используются по умолчанию и не требуют дополнительных затрат. syncronize_. . .
а также observe_on_. . .
Координаты используют mutex и queue-on-a-worker соответственно для безопасного чередования нескольких потоков.
coordination
это фабрика для coordinator
с и имеет scheduler
,
coordinator
имеет worker
и является фабрикой для скоординированных observable
s, subscriber
с и schedulable
функции.
Все операторы, которые принимают несколько потоков или совершают сделки вовремя (даже подписываться и наблюдать), принимают параметр координации, а не планировщик.
Вот некоторые поставляемые функции, которые будут производить координацию с использованием определенного планировщика.
Планировщика пула потоков пока нет. Планировщик пула потоков требует зависимости от реализации пула потоков, так как я не хочу писать пул потоков. Мой план состоит в том, чтобы создать планировщик для пула потоков Windows, пула потоков Apple и пула исполнителей asio. Один вопрос, на который нужно ответить, — должны ли эти специфичные для платформы конструкции находиться в репозитории rxcpp или иметь репозитории для конкретной платформы.
Вклад, мнения и идеи приветствуются!