Итак, примитивы std - это примитивы.Они подходят для непосредственного использования в игрушечных приложениях, где «преждевременное завершение работы» означает «сказать операционной системе, что нужно завершить процесс».
Для более сложных приложений вам необходимо создать что-то из них.
Вам понадобятся пулы потоков вместо использования необработанных потоков, вам, вероятно, понадобятся продолжения задач потоков, и вам потребуется архитектура выключения.
Один из способов реализации архитектуры выключения - этоиспользовать исключения.Если у всех ваших выдающихся будущих обещаний есть центральный бит кода, вы можете установить для них исключение .Или разрушить обещания.И то и другое приводит к тому, что люди ждут, когда на фьючерсе будет выдано исключение.
Или вы можете принудительно установить, что все ваших обещаний / фьючерсов на самом деле future<optional<T>>
и использовать "nullopt", чтобы сказать "мы закрываемся ".Или используйте future<expected<T,Error>>
.
С другой стороны, если ваш асинхронный код основан на продолжениях (включая «продолжить в очередь задач для обработки в режиме ожидания в главном потоке» и «продолжить в другую асинхронную задачу»),Вы можете иметь политику, когда источник продолжения не удался.Некоторые системы продолжения дают следующему что-то вроде std::experimental::expected<Data, Error>
.Другие передают ему состояние готовности или ошибки std::future<Data>
.В других случаях пропущенные вводы продолжений приводят к тому, что продолжение автоматически прекращается.
Завершение работы приложения C ++ затруднительно, особенно если вы хотите сделать это по требованию.Это в основном требует глобального события, которое сворачивает все пути управления в приложении чистым способом.Нет простого ответа.Есть много простых способов заставить его работать таким образом, чтобы это не вызывало каких-либо непосредственных проблем, таких как «просто отсоединить поток» или «просто позвонить exit
».