Другое POSIX-решение, которое является однопоточным и автономным, заключается в использовании сигналов:
#include <unistd.h>
#include <csignal>
std::sig_atomic_t volatile done = 0;
void game_over(int) { done = 1; }
int main()
{
std::signal(SIGALRM, game_over);
alarm(5); // this program will self-destruct in 5 seconds
while (!done)
{
do_my_thing(); // or whatever; make sure this returns frequently
}
}
(Это одно из очень немногих законных и важных применений volatile
: мы должны запретить компиляторуот оптимизации условного выражения while (!done)
, и компилятор не видит, что done
может быть изменен, потому что он никогда не затрагивается внутри тела цикла.)
POSIX не рекомендует использовать std::signal
в пользусвоего, более мощного sigaction
.Обратитесь к руководству, если вам интересно, но для простой цели подачи сигнала тревоги этого решения, по-видимому, достаточно.
Если ваша программа не предлагает вообще никаких точек прерывания (то есть точек, в которых вы можете проверить done
), то вы также можете вызвать abort()
в обработчике сигнала.