根据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).. ??
答案 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