В целом, C++ не имеет способа побудить исключение, которое должно быть выбрано в коде, без кода, который генерирует исключение в коде или код, который вызывает код.
Вы можете встроить ASL, язык сценариев или отдельный процесс. Все 3 могут быть спроектированы так, чтобы их прерывали (процессы, например, можно убить).
Boost имеет прерывистые потоки. Как это работает, так это то, что у него есть крючки в примитивах синхронизации синхронизации (мьютексы и т. Д.), Поэтому, когда вы взаимодействуете с ними, он проверяет, был ли ваш поток остановлен. Если это так, он затем выдает исключение.
Простое, частичное решение является
std::vector<std::future<R()>> futures;
futures.push_back(std::async(std::launch::async, []()->R{ /* code */));
using std::chrono::literals;
if (futures.back().wait_for(500ms)==std::future_status::ready) {
auto r = futures.back().get();
futures.pop_back();
clear_ready_futures(futures); // wait for 0ms and if so, discard and destroy
return r;
}
// failed case
здесь наши futures
магазинов в несуществующих фьючерсах (нити, по сути). clear_ready_futures
очищает все старые, которые закончились.
Задачи, которые были запущены, по-прежнему выполняются до завершения, краду процессора, но вызывающий код не должен ждать их.
Имеет ли значение ОС - например, SIG_ALARM на linux, безусловно, разрешит это # – UKMonkey
@UKMonkey: Это для add.js node под FreeBSD. Но я думаю, что каждая информация поможет. – ElSajko
Самый простой способ - фактически запустить рискованный бизнес в отдельном потоке. Затем вы ожидаете результат в 'std :: future', используя http://en.cppreference.com/w/cpp/thread/future/wait_for. – StoryTeller