2015-03-19 133 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()。