2013-03-18 58 views
0

我很好奇,如果我能夠做的unistd c函數alarm(int signal)Alarm()可以像這樣在多線程中使用嗎?

有我的主要....併爲每個線程帽子創建initializate與功能的SIGALRM,應關閉以下我線程在激活的情況下。這可能嗎?或者1 SIGALRM/main只是合法的?

+3

你在說哪個'alert()'? [這個?](http://linux.die。net/man/3/alert)我不知道[unistd.h]中的「alert」(http://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html) – Mike 2013-03-18 16:45:07

+3

也許[ 「this one」](http://pubs.opengroup.org/onlinepubs/9699919799/functions/alarm.html) – Mat 2013-03-18 16:46:34

+1

請參閱:http://stackoverflow.com/questions/7296923/different-signal-handler-for-線程和進程是可能的 - 也許它不能回答你的整個問題,但它有一些有趣的信息。 – Mat 2013-03-18 16:53:40

回答

2

進程中的每個線程有一個獨立的信號掩模,其 表示一套線程當前阻塞信號。線程可以使用pthread_sigmask(3)來操作其信號掩碼。在 傳統的單線程應用程序中,可以使用sigprocmask(2)來操縱信號掩碼。

來自人7信號。

問題是,每個進程的警報工作,而不是每個線程,所以如果線程的sigmask是相同的,你不能真正知道哪一個會接收信號。

2

好的,首先,alarm()實際上是一個無符號的 int值,它是過期前的秒數。因此,您的示例int signal不是alarm()的正確實施,僅供參考。

至於這個雲:

for each thread that is created to initialization a SIGALRM
所產生的所以每個線程的過程沒有這樣做,所以你必須抓住報警,並有一些內部戰略需要知道的SIGALRM其中你提出它的線程並相應地處理它。一旦你有你的處理器,你可以一遍又一遍地報警,但請記住:

報警請求沒有堆積;

所以你必須一次做這個。這仍然是可能的,但並不像你期望的那樣完全向前邁進。

對於我說的是什麼非常粗略的例子:

  • 你有一個「經理」,其跟蹤的請求
  • 線程1告訴它需要處理10S
  • 東西經理
  • 經理「記載」這一點,並調用設置alarm(10)
  • 線程2告訴它需要管理者在3秒內
  • 經理呼籲alarm(0)到基爾加丹被喚醒l鬧鐘,撥打電話alarm(3),然後注意,一旦發生故障,它需要呼叫alarm(7)完成線程1的睡眠時間
  • 在您的鬧鐘處理程序中,您只需調用管理​​器並讓它知道鬧鐘已關閉,並將喚醒相應的鬧鐘線程(2),然後重置下一個警報。
相關問題