Стандарты C ++ 03 и C07 на самом деле не предоставляют никакого портативного способа сделать это. Если вы не можете зависеть от более нового компилятора, почти единственным разумно переносимым выбором, вероятно, являются потоки POSIX (об этом подробнее ниже).
В C ++ 11 вы можете создать поток и использовать std::sleep_until
или (если хотите, по какой-то причине) std::sleep_for
. Одной из причин предпочесть последнее было бы переносимость по сравнению с C. В C1x есть функция thrd_sleep
, которая по существу похожа на std::sleep_for
, поэтому может быть немного проще использовать по существу одну и ту же функцию в обеих.
Переносимость (в этом случае) может быть трудно определить. Эти функции содержатся в стандарте C ++ и в черновике C, но оба они, очевидно, очень новые, поэтому трудно догадаться, реализуют ли их на самом деле компиляторы, которые вас интересуют. В то же время, они довольно тесно основаны на pthreads, поэтому, вероятно, больше шансов увидеть, что они уже реализованы (или скоро), чем если бы они были в основном новыми и разными.
Если вы хотите ограничиться C ++, вы также можете рассмотреть Boost.thread . Это очень похоже на то, что входит в стандарт, но оно уже доступно почти для всех основных компиляторов и платформ.
Как упомянуто выше, другой возможностью было бы непосредственное использование потоков POSIX. Теоретически это может быть не так переносимо (по крайней мере, в долгосрочной перспективе), но на самом деле это, вероятно, по крайней мере прямо сейчас - и, в частности, может быть переносимо на все платформы, которые вас действительно волнуют, а это большинство из того, что действительно имеет значение. Очевидно, что они доступны практически на всех Unix-подобных платформах, а также есть порт для Win32 .
Я, вероятно, должен добавить предупреждение, которое, как я думаю, довольно незначительно: ни один из этих способов не гарантирует выполнение в «точное время». Они в значительной степени гарантируют, что ваш поток будет спать по крайней мере столько, сколько вы укажете, но это может быть и дольше - но это также верно для at
и cron
. Большинство типичных операционных систем не «в реальном времени», поэтому любая попытка запустить в точное время безнадежна, если вы не определили «точное» довольно свободно. Большинство людей в первую очередь заинтересованы в том, чтобы быть достаточно близко, чтобы это выглядело и казалось правильным для пользователя, поэтому ничего более точного, чем одна десятая секунды или около того, не нужно. В этом случае вы, как правило, можете делать это довольно хорошо (хотя, если система действительно сильно загружена, даже это может быть проблемой).