2009-12-02 26 views
0

有人知道某個特定線程被暫停和恢復時的通知方式嗎?.Net如何在線程暫停時有效地通知?

我希望能夠以這樣的事:

thread.Suspended += delegate 
{ 
    //Do something 
}; 

thread.Resumed += delegate 
{ 
    //Do something else 
}; 

我懷疑.Net框架有這個能力,但有一個技術與PInvoke的可能實現這一目標?我需要它可能與低開銷。

+0

你爲什麼想知道?你試圖啓用哪種場景? – Michael 2009-12-02 02:30:48

+0

我試圖調整一個ThreadPool,讓每個CPU有一個活動線程。它會嘗試儘可能保持池中每個cpu只有一個線程,並且只有當其中一個活動線程被阻塞時纔會創建新線程。 – 2009-12-02 02:36:12

+0

如果您創建另一個線程,並且之前被阻止的線程再次喚醒,該怎麼辦?聽起來就像你試圖微觀管理貓放牧一樣。 – 2009-12-02 07:48:35

回答

2

如果您致力於編寫自己的線程池,這可能沒有幫助,但我會嘗試堅持使用.NET ThreadPool類,並根據需要使用SetMaxThreads/SetMinThreads和GetMaxThreads/GetAvailableThreads調整它。有沒有什麼特別的原因,爲什麼這不夠好?

去年我在PDC,並參加了一些關於並行性的Joe Duffy的談話,這很有意思。我記得他說的是在.NET中提供一個可擴展的線程池類,因爲MSFT通常會發現,當人們去編寫自己的線程池時,他們大多數時間都可以正常工作,但是會被各種陷阱所困擾。通過提供可擴展性機制,他們希望能夠限制開發人員被發現的可能性。

+0

.Net ThreadPool足夠好,只有當工作項已排隊超過一秒鐘時,纔會將線程添加到其池中。我只是嘗試了一下,如果線程池有可能只在其中一個線程完成阻塞操作時創建新線程,但我想這是無法管理的。 – 2009-12-02 13:15:34

0

Windows對於Thread.Suspend/Thread.Resume沒有這種通知機制您不應該使用Thread.Suspend/Thread.Resume - 它很容易導致死鎖和其他難以發現的錯誤。使用正常的同步原語(鎖定,事件等)來使線程阻塞,直到它有工作要做。

UPDATE:

您可以啓用ETW context switch events並通過ProcessTrace食用。 OldThreadId和OldThreadState將說明線程停止運行的原因(轉換爲就緒,待機,等待等)。 NewThreadId會告訴你線程什麼時候開始運行。您必須在系統中每處理上下文切換時處理事件。這將是令人難以置信的高音量,在你的過程中消耗大量的CPU,並且很難準確無誤。

+0

謝謝,但我不是在談論使用Thread.Suspend()或Thread.Resume(),我只想在線程掛起時(通過調度程序或阻止操作)得到通知。我希望有一個能夠做到這一點的黑客。 – 2009-12-02 02:25:07