Я бы не рекомендовал использовать для этого отдельную тему. Но так как это похоже на упражнение, чтобы научиться использовать потоки, я пойду с этим.
Вы можете установить глобальный логический флаг, который указывает, была ли введена цифра. В g_start_timer, непосредственно перед вызовом function_pointer, проверьте, был ли установлен флаг. Если это так, не вызывайте функцию.
Если вы хотите, чтобы поток умер раньше, до истечения периода ожидания, вы можете использовать мьютекс с попыткой блокировки.
РЕДАКТИРОВАТЬ: Поскольку вы говорите, что это не упражнение, я упомяну, как я бы это сделал. Либо используйте функцию, которая может прервать ожидание ввода в stdin, например, select () или poll (). Или используйте alarm () для прерывания. Вот пример использования будильника:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
void alarm_signal(int signum)
{
}
int main()
{
char c;
unsigned int v = 0;
struct sigaction act;
puts("Enter digit: ");
/* Register dummy handler for alarm */
act.sa_handler = &alarm_signal;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
/* Set timer for 3 seconds */
alarm(3);
/* Read the digits */
errno = 0;
while(0 != read(STDIN_FILENO, &c, 1))
{
if(c < '0' || c > '9')
break;
v = v*10 + c - '0';
}
if(errno == EINTR)
puts("Timed out");
else
printf("Value is %d\n", v);
return 0;
}