2011-09-22 216 views
1

這是情況,我有一個線程運行,部分由我沒有的代碼控制。我開始線程,所以我有它的線程ID,但後來我把它傳遞給其他代碼。我需要能夠判斷當前其他代碼是否已經導致線程阻塞來自我所控制的另一個線程。有沒有辦法在pthreads中做到這一點?我想我正在尋找與Java的Thread類中的getState()方法等同的東西(http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#getState()) 。檢查pthread線程是否被阻塞

--------------編輯-----------------

它的確定,如果該解決方案是依賴於平臺。我已經爲使用/ proc文件系統的linux找到了一個解決方案。

+0

你究竟在努力完成什麼?除嘗試模仿java之外,可能還有其他更好的方法。 – Duck

+1

這是一個測試框架。我們試圖控制線程的時間表,以便人們可以在明確定義的線程時間表下測試可重入代碼。 –

回答

2

您可以爲一些pthreads函數編寫包裝器,它只是在調用原始函數之前/之後更新一些狀態信息。這將允許您跟蹤哪些線程正在運行,何時獲取或持有互斥鎖(以及哪些線程),何時等待哪些條件變量,等等。

當然,這隻會告訴你它們何時被阻塞在pthreads同步對象上 - 它不會告訴你他們什麼時候阻止了其他事情。

+0

這真的很好,我可能會做這樣的事情。你認爲有一種方法可以確定它們是否阻塞了其他像I/O這樣的東西嗎? –

+0

我認爲這樣做的方式可能取決於他們阻止什麼。如果你可以告訴他們不活動,並且不阻塞在pthread上,可以肯定地說他們正在等待其他東西......但是發現_什麼可能會很複雜。儘管如此,我還沒有充分研究它的說法。 – Dmitri

-1

在將線程移交給其他代碼之前,請設置由互斥鎖保護的標誌。當線程從您不控制的代碼返回時,清除互斥鎖保護的標誌。然後,您可以從任何需要的地方檢查線程是否在您無法控制的代碼中。

從代碼外部,阻塞和未阻塞之間沒有區別。如果你真的檢查了線程的狀態,你會得到無意義的結果。

例如,考慮兩個庫實現。

答:我們在調用線程中完成所有工作。 B:我們派遣一個工作線程來完成這項工作。調用線程阻塞直到工作完成。

在這兩種情況下,您不控制的代碼A和B都同樣取得進展。你'getstate'的想法會提供不同的結果。所以這不是你想要的。

+0

這不起作用,因爲線程狀態(阻止或未阻止)可能會在我再次獲得控制權之前更改。 –

+0

當然,但你爲什麼要關心?如果你要檢查一分鐘後的操作是否還在進行(可能是決定取消它還是繼續前進),那麼在檢查完成後你不會在乎是否完成了分秒。一旦你決定足夠的時間已經過去,你認爲它還在繼續,你必須不可撤銷地決定放棄。你所問的關於'getstate'的情況也是一樣的。 –

+0

爲什麼我在乎,請看看我爲原始問題所做的評論。 –