У меня есть задача делать что-то каждую "круглую" минуту (в xx: xx: 00) И я использую что-то вроде
const int statisticsInterval=60;
time_t t=0;
while (1)
{
if (abs(t-time(NULL)==0)) //to avoid multiple calls in the same second that is the multiple of 60
boost::this_thread::sleep(boost::posix_time::seconds(2));//2, not 1 to make sure that 1 second passes
t=time(NULL);
boost::this_thread::sleep(boost::posix_time::seconds(statisticsInterval-(t%statisticsInterval)));
//DO WORK
}
. Как видите, я использую сон (60 секунд - количество прошедших секунд в текущей минуте). Но один программист сказал мне, что это неточно, и что я должен изменить его на цикл while с sleep (1) внутри. Я считаю весьма сомнительным, что он прав, но я просто хотел проверить, знает ли кто-нибудь, есть ли меньшая точность, если интервал сна длинный. Я предполагаю, что спящий режим реализован таким образом, что в определенное время в будущем активируется триггер, и поток помещается в «готовую к выполнению группу потоков», поэтому я не вижу причин для различия в точности. BTW OS - это ubuntu, и меня не волнуют ошибки менее 2-3 секунд. Например, если я сплю 52 секунды, вполне приемлемо 53,8 сна. P.S. Я знаю о сне, определяющем минимальное время, и что теоретически моя нить может активироваться в 2047 году, но я спрашиваю о реалистичных сценариях.