如果我们使用sigev_notify作为SIGEV_THREAD,为什么timer_create会产生线程

时间:2018-01-29 09:54:17

标签: c multithreading timer linux-kernel

根据timer_create函数,如果我们使用SIGEV_THREAD作为sigev_notify,那么每次到期时新线程都会创建。但是为什么timer_create函数会产生新的线程,在我的例子之下,

int main(){

  printf ("My process ID %d", getpid ());

  int status = 0;

  timer_t timer_id;

  memset (&timer_id, 0, sizeof (timer_t));

  int j = 10;

  struct itimerspec ts;

  struct sigevent se;

  se.sigev_notify = SIGEV_THREAD;

  se.sigev_value.sival_int = j;

  se.sigev_notify_function = timer_thread;

  ts.it_value.tv_sec = 3;

  ts.it_interval.tv_sec =0;

  status = timer_create (CLOCK_REALTIME, &se, &timer_id);

  printf ("timer_id is %ld\n",(long int)timer_id);

  assert (!status && "Create timer");

  status = timer_settime (timer_id, 0, &ts, 0);

  assert (!status && "Set timer");

return 0;

}

在此特定进程中运行的线程数-id为2,

PID SPID TTY TIME CMD

9945 9945 pts / 20 00:00:18 timer_create

9945 9946 pts / 20 00:00:00 timer_create

如果我们使用SIGEV_SIGNAL,则timer_create不会创建线程。

请任何人告诉我为什么在timer_create函数期间创建了线程(如果我们使用SIGEV_THREAD).. ??

1 个答案:

答案 0 :(得分:1)

它需要一个辅助线程来满足SIGEV_THREAD要求从另一个线程man sigevent调用回调:

  

SIGEV_THREAD

     

通过调用sigev_notify_function来通知进程,就像“它是新线程的启动函数一样。 (这里的实现可能性包括每个计时器通知可能导致创建新线程,或者创建单个线程以接收所有通知。)使用{{1}调用该函数作为唯一的论点。如果sigev_value不是sigev_notify_attributes,则应指向NULL结构,该结构定义新线程的属性(请参阅pthread_attr_t(3))。

如果你研究timer_create的glibc实现,你可能会注意到它创建了一个线程来处理所有使用pthread_attr_init选项的定时器:

SIGEV_THREAD