Как заблокировать поток на процессоре, чтобы потом его разбудить?

Как заблокировать поток на процессоре (чтобы он не использовал процессорное время), а затем пробудить его через время 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");
Другие вопросы по тегам