我在POSIX/Linux環境中有一個多線程應用程序 - 我無法控制創建pthread的代碼。在某些時候,進程 - pthreads的所有者 - 接收到一個信號。POSIX API調用列出進程中運行的所有pthreads
該信號的處理程序應該中止,取消或停止所有的pthread並記錄運行的pthread數量。
我的問題是,我找不到如何列出正在運行的所有pthreads。
我在POSIX/Linux環境中有一個多線程應用程序 - 我無法控制創建pthread的代碼。在某些時候,進程 - pthreads的所有者 - 接收到一個信號。POSIX API調用列出進程中運行的所有pthreads
該信號的處理程序應該中止,取消或停止所有的pthread並記錄運行的pthread數量。
我的問題是,我找不到如何列出正在運行的所有pthreads。
似乎沒有任何可移植的方式來枚舉進程中的線程。
Linux有pthread_kill_other_threads_np
,看起來像原來純粹的用戶態pthreads實現中的剩餘部分,可能會或可能不會像今天記錄的那樣工作。它不會告訴你有多少線程。
您可以通過查看/proc/self
(或者對於其他進程,/proc/123
)獲得有關您的流程的大量信息。雖然許多unice都有一個帶有該名稱的文件或目錄,但版式完全不同,因此使用/proc
的任何代碼都將是Linux特有的。內核源文件/proc
位於Documentation/filesystems/proc.txt
。特別是,/proc/self/task
有一個每個線程的子目錄。子目錄的名稱是LWP ID;不幸的是,[1][2][3]似乎沒有辦法將LWP ID與pthread ID相關聯(但如果您爲此工作,可以使用gettid(2)
獲得您自己的線程ID)。當然,閱讀/proc/self/task
不是原子的;線程的數量可以通過/proc/self/status
自動獲得(但當然,在你採取行動之前它可能會發生變化)。
如果使用Linux pthreads獲得的有限支持無法達到您想要的效果,另一種策略是播放動態鏈接技巧,以提供您自己的版本pthread_create
,該版本記錄到可以在以後檢查的數據結構中。
你可以換行ps -eLF
(或者更接近你剛纔感興趣的進程的另一個命令)並且讀取NLWP
列來找出有多少線程正在運行。
謝謝,但我寧願去API調用 - 如果存在。但我不知道如何使用此解決方案停止或銷燬pthread。 – 2010-08-13 10:16:16
@msalvadores,true,停止程序內的線程將不會與我的hacky答案一起工作 - 但您可以退出(2)此過程,或者您的信號處理程序可以設置一個全局變量,線程會定期檢查;當它被設置時,線程退出。 – sarnold 2010-08-13 10:48:05
鑑於線程在您的過程中,它們應該在您的控制之下。您可以將它們全部記錄在數據結構中並進行跟蹤。
但是,除非它被適當地管理(或者你只能創建和連接一個線程中的線程),否則這樣做不會成爲競態條件。
你使用的庫創建的任何線程都是他們的業務,你不應該搞亂它們的目錄,否則庫可能會中斷。
如果你打算退出進程,你可以讓線程繼續運行,因爲調用exit()會終止它們。
請記住,一個強大的應用應該是碰撞安全的,所以你不應該依靠關閉行爲,以避免數據丟失等
>鑑於線程正處於您的過程中,它們應該在您的控制之下:這是錯誤的。庫可以創建進程,並且如果您在另一個VM內運行,則無法控制線程創建。 – 2014-11-09 14:25:57
非常感謝您的回覆。我喜歡你最後的解決方案。我會稍微調查一下。我寧願避免讀/ proc/stuff,主要是因爲可移植性問題。 – 2010-08-13 11:24:33