Q:

Запуск функции и продолжение выполнения программы

В программе имеется цикл и отдельная функция, в которой происходит синхронизация данных (долгая операция, выполняется более 10 сек.).  В цикле используется таймер, который запускает эту функцию по его истечению.  Но пока выполняется функция цикл стоит.  Вот пример программы:
int sync(struct stack **data) {
 // обновляем массив data из файла
}

int main() {
 struct stack *data=NULL;
 struct itimerspec t={0};
 struct timeval timeout={0,0};
 int timerfd;
 uint64_t exp;

 t.it_value.tv_sec=50;
 t.it_interval.tv_sec=0;

 if ((timerfd=timerfd_create(CLOCK_REALTIME,TFD_NONBLOCK))==-1)    {return EXIT_FAILURE;}
 if (timerfd_settime(timerfd,0,&t,0)==-1) {return EXIT_FAILURE;}

 while (TRUE) {
  if (read(timerfd,&exp,sizeof(uint64_t))>0) {
   sync(&data);
  }
  // проверка данных в массиве data и какие либо действия
 }
}

Можно ли как-то запускать функцию sync, скажем на фон, чтобы цикл выполнялся дальше? 

A:

Я привожу пример используя библиотеку Glib
но работа с потоками аналогична и вдругих библиотеках. 
создаете структуру в которой находятся обрабатываемые двнные 
typedef struct _data_s data_s;
struct _data_s
{
  int first;
};

создаем семафор контролируюший доступ к данным
GMutex mutex;

создаете функцию отдельного потока которая будет обрабатывать данные
static gpointer thread_fun(gpointer d)
{ 
 data_s * data = (data_s*)d;

 for(;;){
   int local_first;

    /*чтение данных*/
   g_mutex_lock(&mutex);
   local_first = data->first;
   g_mutex_unlock(&mutex);

   /*обработка данных*/
  ....

    /*запись данных*/
   g_mutex_lock(&mutex);
   data->first = local_first;
   g_mutex_unlock(&mutex);

   /*если требуется накопление данных*/
   g_usleep(TIMEOUT);
 }
 return NULL;

}
и в основной функции запускаете поток, накапливаем данные и передаете их в поток обработки
int main(int argc,char * argv[])
{
 GThread * thread;
 data_s  data;

 data.first = 5;

 g_mutex_init(&mutex);

 thread = g_thread_new("data",thread_fun,&data);

  for(;;){
    g_mutex_lock(&mutex);
    data->first = read();
    g_mutex_unlock(&mutex);

  }

 return 0;
}

