2015-03-19 149 views
1

我正在实现一个使用线程的程序。我希望每个创建的线程都被延迟一段时间。然后一个信号被发送到线程,并且处理程序应该打印一条消息。我的问题是向一个线程发送一个信号。怎么可能向每个创建的线程发送一个报警信号? 我可以使用pthread_kill(),但我怎样才能指定时间在报警(6)等?发送信号给线程

void *thread(void *parameter) 
{ 
     //How to send a signal to a thread 
} 
void threadHandler(int sig) 
{ 
    printf("hello from thread\n"); 
} 
+0

相关:http://stackoverflow.com/questions/5282099/signal-handling-in-pthreads – dragosht 2015-03-19 08:45:45

+0

为什么不让主线程处理信号并向线程广播条件? – dvhh 2015-03-19 08:56:52

+0

,因为每个线程都会有不同的延迟。 – user4546686 2015-03-19 09:00:59

回答

0

好吧,有一种可能性是制作一个额外的线程,它使用例如一段时间休眠一段给定的时间。然后使用pthread_kill将要发送的信号发送到正确的线程。如果你想送三个信号,之后1,3和5秒钟后,您可以使用此代码:

usleep(1*1000*1000); 
pthread_kill(thread1, SIGALRM); 
usleep(2*1000*1000); 
pthread_kill(thread2, SIGALRM); 
usleep(2*1000*1000); 
pthread_kill(thread3, SIGALRM); 

如果你是在Linux上,你可以使用timerfd_create()来创建一个定时器文件描述符从数据可以在给定的时间量过后读取。所以,如果你有10个线程,您可以使用线程特定的超时创建10个timerfd,然后使用epoll_wait()循环(请参阅epoll_create和epoll_wait手册页),该循环用于侦听要从timerfds读取的数据并将信号发送到正确的线程是要读取的数据。

我不认为有一个现成的接口在特定的时间过去之后向特定的线程发送一个SIGALRM信号,但是如果创建一个额外的线程是一个选项,您可以使用usleep来模拟它()或timerfd_create()/ epoll_wait()。