После изучения исходного кода я обнаружил, что QThread :: sleep имеет реализацию:
void QThread::sleep(unsigned long secs)
{
struct timeval tv;
gettimeofday(&tv, 0);
struct timespec ti;
ti.tv_sec = tv.tv_sec + secs;
ti.tv_nsec = (tv.tv_usec * 1000);
thread_sleep(&ti);
}
static void thread_sleep(struct timespec *ti)
{
pthread_mutex_t mtx;
pthread_cond_t cnd;
pthread_mutex_init(&mtx, 0);
pthread_cond_init(&cnd, 0);
pthread_mutex_lock(&mtx);
(void) pthread_cond_timedwait(&cnd, &mtx, ti);
pthread_mutex_unlock(&mtx);
pthread_cond_destroy(&cnd);
pthread_mutex_destroy(&mtx);
}
следуйте этой теме https://linux.die.net/man/3/pthread_cond_timedwait. Если поддерживается опция выбора часов, переменная условия должна иметь атрибут clock, который указывает часы, которые должны использоваться для измерения времени, указанного в аргументе abstime. Когда происходят такие таймауты, pthread_cond_timedwait () тем не менее должен освободить и повторно получить мьютекс, на который ссылается мьютекс. Функция pthread_cond_timedwait () также является точкой отмены.
Так что, если я переключу систему на проход, функция сна будет спать до тех пор, пока не встретится> = системное время начала сна + период сна.