Проблема в том, что с внутрипроцессным решением без поддержки функции вы можете получить потенциально недопустимое состояние.
Пример. Когда вы прерываете поток во время выделения памяти, ваша куча процесса может быть повреждена.
Таким образом, вы можете завершить вызов, но тогда вам также придется завершить процесс. Во многих случаях шансы на разрушительные побочные эффекты невелики, но я бы не стал делать ставку на это.
Вы можете, как предлагает Бен Штрауб, просто осиротеть поток: поставить его на самый низкий приоритет и позволить ему работать бесконечно. Это, конечно, только ограниченное решение: если поток потребляет ресурсы (вероятно), они замедляют работу системы, также существует ограничение на количество потоков на процесс (обычно из-за адресного пространства для стека потоков).
Как правило, я бы предпочел решение для внешнего процесса. Простой шаблон таков:
Запишите входные данные в файл, запустите внешний процесс с файлом в качестве аргумента. Внешний процесс записывает ход выполнения (если есть) в файл на диске, который можно отслеживать, и может даже позволить процессу возобновиться с того места, с которого он был запущен. Результаты записываются на диск, и родительский процесс может их читать.
Когда вы завершаете процесс, вам все равно приходится иметь дело с синхронизацией доступа к внешним ресурсам (например, файлам), а также с тем, как обращаться с заброшенными перехватчиками, наполовину записанными файлами и т. Д. Но это, как правило, ПУТЬ к надежному решению.