Как заблокировать поток на процессоре, чтобы потом его разбудить?
Как заблокировать поток на процессоре (чтобы он не использовал процессорное время), а затем пробудить его через время t без использования сигнального механизма.
1 ответ
Нет кроссплатформенного способа сделать это, но есть несколько вариантов:
Поскольку вы делаете это в Linux, лучшим вариантом будет pthread
библиотека и что-то вроде pthread_mutex_timedlock
Пример:
#include <pthread.h>
#include <time.h>
pthread_mutex_t mutex;
struct timespec timeout;
timeout.tv_sec = 2; // Two seconds
timeout.nv_nsec = 0; // Zero nanoseconds
pthread_mutex_init(&mutex, NULL); // Initialize mutex object
pthread_mutex_timedlock(&mutex, &timeout); // Wait for two seconds.
Рекомендуется проверить возвращаемое значение функций на наличие ошибок, которые могли произойти.
Если вы действительно не хотите использовать какие-либо библиотеки ОС, вы не можете перевести поток в спящий режим, но вы можете использовать специальные инструкции, такие как pause
или же rep; nop;
во время вращения, чтобы уменьшить потребление энергии.
Например:
while (time(NULL) < timeToWake) asm("pause");