Мне нужно управлять многозадачными задачами CPU в интерактивном приложении. Так же, как и в прошлом, мое конкретное приложение - это интерфейс инженерного проектирования. Поскольку пользователь настраивает различные параметры и параметры модели, в фоновом режиме запускаются несколько симуляций, и результаты отображаются по мере их завершения, вероятно, даже когда пользователь все еще редактирует значения. Поскольку множественные симуляции занимают переменное время (некоторые миллисекунды, некоторые занимают 5 секунд, некоторые занимают 10 минут), это в основном вопрос получения обратной связи, отображаемой как можно быстрее, но часто прерывание заданий, которые начались ранее, но теперь больше не нужны, изменений пользователя уже аннулировали их. Различные пользовательские изменения могут привести к недействительности различных вычислений, поэтому в любой момент времени у меня может быть 10 различных симуляций. Somesimulations имеют несколько частей, которые имеют зависимости (моделирование A и B можно вычислить отдельно, но мне нужны их результаты для моделирования семян C, поэтому мне нужно дождаться, когда и A, и B закончите сначала до начала C.)
Я уверен, что метод уровня кода для обработки такого типа приложений - это своего рода многопоточная очередь заданий. Это будет включать в себя функции отправки заданий для выполнения, задания приоритетов задач, ожидание завершения работ, определение зависимостей (выполнить это задание, но только после завершения задания X и задания Y), отмена подмножеств заданий, которые соответствуют некоторым критериям, остаются рабочие места, устанавливаются подсчеты и приоритеты рабочих потоков и т.д. И мультиплатформенная поддержка тоже очень полезна.
Это не новые идеи или желания в программном обеспечении, но я нахожусь на раннем этапе разработки своего приложения, где мне нужно сделать выбор, какую библиотеку использовать для управления такими задачами. В прошлом я написал свои собственные сырые менеджеры потоков в C (я думаю, это обряд посвящения), но я хочу использовать современные инструменты, чтобы основывать свою работу, а не мои предыдущие хаки.
Первая мысль - перейти в OpenMP, но я не уверен, что хочу. OpenMP отлично подходит для распараллеливания на тонком уровне, автоматически развертки и т.д. В то время как мультиплатформенный, он также вторгается в ваш код С#pragmas. Но в основном он не предназначен для управления большими задачами.. особенно отменяя ожидающие задания или определяя зависимости. Возможно, да, но это не изящно.
Я заметил, что Google Chrome использует такой менеджер заданий даже для самых тривиальных задач. Цель проекта состоит в том, чтобы сохранить пользователя поток взаимодействия как можно более легкий и проворный, так что все, что может возникнуть асинхронно, должно быть. От взгляда на источник Chrome это, похоже, не является общей библиотекой, но все же интересно посмотреть, как дизайн использует асинхронные запуска для быстрого поддержания взаимодействия. Это похоже на то, что я делаю.
Существуют и другие варианты:
Surge.Act: a Boost-подобная библиотека для определения заданий. Он основывается на OpenMP, но позволяет цепочки зависимостей, которые хороши. Кажется, он не чувствует, что у него есть менеджер, которого можно запросить, отменены задания и т.д. Это устаревший проект, поэтому страшно зависеть от него.
Очередь работы довольно близка к тому, о чем я думаю, но это 5-летняя статья, а не поддерживаемая библиотека.
Boost.threads имеет хорошую независимую от синхронизации синхронизацию, но это не менеджер заданий. POCO имеет очень чистые конструкции для запуска задачи, но опять же не полный менеджер цепочки задач. (Возможно, я недооцениваю POCO).
Итак, пока есть доступные опции, я не удовлетворен, и я чувствую желание снова перевернуть мою собственную библиотеку. Но я предпочел бы использовать то, что уже существует. Даже после поиска (здесь, на SO и в сети) я не нашел ничего, что кажется правильным, хотя я считаю, что это должен быть своего рода инструмент, который часто необходим, поэтому наверняка есть какая-то библиотека сообщества или, по крайней мере, общий дизайн. В SO были некоторые сообщения о очередях заданий, но ничего похожего не поместилось.
Мое сообщение здесь, чтобы спросить вас, какие существующие инструменты я пропустил, и/или как вы свернули свою собственную многопоточную очередь заданий.