Как я могу сообщить будущее C ++ без установки значения? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть нить, ожидающая будущего.Если мое приложение закрыто, я бы хотел присоединиться к ветке.Как я могу уведомить о будущем, не обманывая его и не установив какое-либо значение?

auto promise = std::promise<std::string>();
...
auto future = promise.get_future();
auto consumer = std::thread([&]
{
   while (future.wait_for(10ms)){
       // do something
       std::cout << future.get().c_str();
   }
});
...
consumer.join();

1 Ответ

0 голосов
/ 03 октября 2018

Итак, примитивы std - это примитивы.Они подходят для непосредственного использования в игрушечных приложениях, где «преждевременное завершение работы» означает «сказать операционной системе, что нужно завершить процесс».

Для более сложных приложений вам необходимо создать что-то из них.

Вам понадобятся пулы потоков вместо использования необработанных потоков, вам, вероятно, понадобятся продолжения задач потоков, и вам потребуется архитектура выключения.

Один из способов реализации архитектуры выключения - этоиспользовать исключения.Если у всех ваших выдающихся будущих обещаний есть центральный бит кода, вы можете установить для них исключение .Или разрушить обещания.И то и другое приводит к тому, что люди ждут, когда на фьючерсе будет выдано исключение.

Или вы можете принудительно установить, что все ваших обещаний / фьючерсов на самом деле future<optional<T>> и использовать "nullopt", чтобы сказать "мы закрываемся ".Или используйте future<expected<T,Error>>.

С другой стороны, если ваш асинхронный код основан на продолжениях (включая «продолжить в очередь задач для обработки в режиме ожидания в главном потоке» и «продолжить в другую асинхронную задачу»),Вы можете иметь политику, когда источник продолжения не удался.Некоторые системы продолжения дают следующему что-то вроде std::experimental::expected<Data, Error>.Другие передают ему состояние готовности или ошибки std::future<Data>.В других случаях пропущенные вводы продолжений приводят к тому, что продолжение автоматически прекращается.

Завершение работы приложения C ++ затруднительно, особенно если вы хотите сделать это по требованию.Это в основном требует глобального события, которое сворачивает все пути управления в приложении чистым способом.Нет простого ответа.Есть много простых способов заставить его работать таким образом, чтобы это не вызывало каких-либо непосредственных проблем, таких как «просто отсоединить поток» или «просто позвонить exit».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...