2010-11-24 23 views
0


有沒有人可以提供librt.so.1的timer_helper_thread()函數的一些信息。
我在我的應用程序中使用posix timer_create()函數來實現計時器功能,並且我使用SIEV_THREAD進行通知。當超時發生時,我可以在gdb中看到兩個線程正在創建。一個是我已經指定了啓動函數的線程,另一個是啓動函數是librt.so.1的timer_help_therad()的線程。即使在我的線程退出後,這兩個timer_helper_thread()也不退出。有人會告訴我什麼時候timer_helper_thread()退出並給它提供一些信息?有關librt.so.1的timer_helper_thread()函數的一些信息

回答

0

簡答:不要擔心;這是一個實現細節,當你的程序退出時它會自行清理。但是,如果你很好奇...

從glibc的的timer_create(2)手冊頁:

SIGEV_THREAD: 當計時器到期時,調用sigev_notify_function就好像它是一個新的線程啓動功能。 (其中實現可能性這裏是每個計時器通知可能導致創建一個新的線程,或者是一個單獨的線程創建接收所有通知。)

而且也:

的SIGEV_THREAD的功能在glibc中實現,而不是在內核中實現。

因此,glibc(即librt.so)假定內核無法創建一個響應定時器事件的線程 - 它支持的所有功能都是發送信號。所以有人需要接收該信號並創建處理程序線程。如果您想要自己細化接收信號的細節,那麼您就不會使用SIGEV_THREAD,因此glibc不會打擾您,而只是爲了處理定時器事件而創建自己的線程。

此計時器助手線程持續時間從您呼叫timer_create()的第一次,直到您的程序結束。除非你做了不尋常的事情,否則你不需要擔心;它會在你的程序退出後自行清理。它所做的唯一的事情就是等待一個定時器到期,所以它沒有使用任何額外的處理能力。此外,無論您創建了多少個定時器,看起來只會有一個幫助器線程。

+0

@jander ....謝謝jander ...我有一個更多的查詢來問你..自第一次超時發生後,我的進程的內存使用量將增加線程堆棧的大小(我可以通過我的linux機器上的「ulimit -s」找到),因爲這個線程是在運行時創建的...我是對的嗎? – abcd 2010-11-24 08:38:48

0

@jander:你的評論在這裏很有趣「這個計時器幫助程序線程可以持續從第一次調用timer_create()直到程序結束。」 每次定時器超時都會創建線程。這與你提到的timer_helper_thread()相同嗎? 我有一個類似的帖子,我觀察到一個單獨的線程只爲timer_create()創建。這是timer_helper_thread()嗎? Ref:New thread on invocation of timer_create()