Прервать или отменить долгое вычисление в DLL - PullRequest
0 голосов
/ 11 марта 2020

Я разрабатываю SDK как динамическую c библиотеку (DLL / так). Пользователь может установить множество параметров перед запуском вычисления. Но я хотел бы предложить способ динамического изменения параметров, который должен остановить текущее вычисление и перезапустить его с новыми параметрами. Таким образом, общее использование должно выглядеть следующим образом:

Client Caller thread -----> Call my SDK -----> Computation code
                                                      ^
                                                      |
                                                      |
Client UI Thread ----> Request cancelation ------------

У меня много вопросов о механике, и мне интересно, каковы хорошие методы для этого.

1) Как обрабатывать прерывание?

  • Должен ли я выполнять вычисления в асинхронном потоке c и просто отбрасывать результаты этого потока?
  • Следует ли использовать std::atomic<bool>, чтобы вычислительный поток когда-нибудь проверяет, чтобы вернуться к начальной точке?

2) Как использовать второй вариант, каков наилучший способ вернуться к точке запуска?

  • Это хорошо использовать исключения C ++ в этом случае? (ПРИМЕЧАНИЕ: я уже использую исключение для действительно редкого случая в коде вычисления.)
  • Должно ли оно иметь обработку кода ошибки вместе с ранними проверками, чтобы избежать вычислений?
  • Может longjmp или что-то в этом роде подобное что можно использовать?

1 Ответ

1 голос
/ 11 марта 2020

Для правильной очистки объекта и восстановления ресурсов вам нужно либо сгенерировать исключение, либо просто остановить вычисление и позволить функциям вычисления вернуться нормально.

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

Использование std::atomic (легко доступного из любого места), которое Ваш опрос периодически является одним из способов достижения этого. Вы должны будете проверять это регулярно, поэтому проверка должна быть в или около любых ваших петель. Короткие, быстрые циклы не нужно проверять во время цикла, но должна быть какая-то проверка по крайней мере несколько раз в секунду. Как только вы обнаружите запрос на отмену, вы можете либо выбросить свое исключение, либо вернуться из текущей функции (поэтому родительская функция также должна будет проверять отмену).

Один недостаток для всего, что если вы пропустите зарегистрируйтесь в oop где-нибудь, ваша отмена может произойти не сразу.

...