2011-02-09 126 views
1

有誰知道一種方法來確定線程當前是否阻塞?基本上,我想檢查一個特定線程是否被阻塞(在這種情況下,在AF_UNIX數據報套接字接收調用),併發送一個信號中斷,如果它是。確定線程是否被阻塞

我正在使用Boost.Thread的意思下使用pthreads在Linux上工作。我的系統有NPTL。

我認爲答案是「否」,但想看看我是否錯過了一些東西。

+0

如果已經使用Boost :: Thread,爲什麼不使用Boost :: asio來讀? – Max 2011-02-09 15:40:49

+0

據我所知,Boost.Asio不會解決我的問題。我需要能夠確定線程當前是否阻塞,如果它是中斷的話。 Boost.Asio通常會很有用,但並不能解決這個問題,對吧? – deuberger 2011-02-09 16:04:10

回答

2

這不太可能(可以使用專門用於調試器的功能,但它既不簡單,便攜也不安全)。

無論如何,你並不是真的想這麼做,因爲這樣的使用會產生固有的競爭條件。您可以檢查線程是否在即將阻止之前阻止(在這種情況下,您將錯過喚醒線程),或者在發現線程阻塞之後阻止線程阻塞。

通常的方法來解決你的問題就是「自管絕招」:

  • pipe()創建一條管道;
  • 目標線程,而不是在recvfrom()中阻塞,而是在poll()select()中阻止。要監視的文件描述符包括數據報套接字和管道的讀取結束。
  • 要喚醒目標線程,另一個線程將一個字節寫入管道的寫入端。

(該recvfrom()也應改爲使用MSG_DONTWAIT標誌,因爲我們從來沒有想在這裏封鎖,始終擋在了poll()/select()代替)。

0

答案是否定的。在你的平臺上可能有一種方法可以做到這一點,但總的來說,我知道沒有辦法做到這一點。

現在,你潛入你的平臺的下級文件之前三思而後行,如果這是你真正想要什麼:

一個線程被阻塞的一個原因。例如,它可能在FILE IO中被阻塞。如果您正確處理返回值,這可能會被安全地中斷。另一方面,線程也可能在新的/刪除調用或其他標準庫函數中被阻塞。中斷運行時庫中的線程是發生災難的收據。

我知道你有理由在這裏提問,但是imho最好從更高層次角度考慮你的問題,並以一種可以在沒有這種黑客攻擊的情況下達到目標的方式修復你的設計。