有人知道某個特定線程被暫停和恢復時的通知方式嗎?.Net如何在線程暫停時有效地通知?
我希望能夠以這樣的事:
thread.Suspended += delegate
{
//Do something
};
thread.Resumed += delegate
{
//Do something else
};
我懷疑.Net框架有這個能力,但有一個技術與PInvoke的可能實現這一目標?我需要它可能與低開銷。
有人知道某個特定線程被暫停和恢復時的通知方式嗎?.Net如何在線程暫停時有效地通知?
我希望能夠以這樣的事:
thread.Suspended += delegate
{
//Do something
};
thread.Resumed += delegate
{
//Do something else
};
我懷疑.Net框架有這個能力,但有一個技術與PInvoke的可能實現這一目標?我需要它可能與低開銷。
如果您致力於編寫自己的線程池,這可能沒有幫助,但我會嘗試堅持使用.NET ThreadPool類,並根據需要使用SetMaxThreads/SetMinThreads和GetMaxThreads/GetAvailableThreads調整它。有沒有什麼特別的原因,爲什麼這不夠好?
去年我在PDC,並參加了一些關於並行性的Joe Duffy的談話,這很有意思。我記得他說的是在.NET中提供一個可擴展的線程池類,因爲MSFT通常會發現,當人們去編寫自己的線程池時,他們大多數時間都可以正常工作,但是會被各種陷阱所困擾。通過提供可擴展性機制,他們希望能夠限制開發人員被發現的可能性。
.Net ThreadPool足夠好,只有當工作項已排隊超過一秒鐘時,纔會將線程添加到其池中。我只是嘗試了一下,如果線程池有可能只在其中一個線程完成阻塞操作時創建新線程,但我想這是無法管理的。 – 2009-12-02 13:15:34
Windows對於Thread.Suspend/Thread.Resume沒有這種通知機制您不應該使用Thread.Suspend/Thread.Resume - 它很容易導致死鎖和其他難以發現的錯誤。使用正常的同步原語(鎖定,事件等)來使線程阻塞,直到它有工作要做。
UPDATE:
您可以啓用ETW context switch events並通過ProcessTrace食用。 OldThreadId和OldThreadState將說明線程停止運行的原因(轉換爲就緒,待機,等待等)。 NewThreadId會告訴你線程什麼時候開始運行。您必須在系統中每處理上下文切換時處理事件。這將是令人難以置信的高音量,在你的過程中消耗大量的CPU,並且很難準確無誤。
謝謝,但我不是在談論使用Thread.Suspend()或Thread.Resume(),我只想在線程掛起時(通過調度程序或阻止操作)得到通知。我希望有一個能夠做到這一點的黑客。 – 2009-12-02 02:25:07
你爲什麼想知道?你試圖啓用哪種場景? – Michael 2009-12-02 02:30:48
我試圖調整一個ThreadPool,讓每個CPU有一個活動線程。它會嘗試儘可能保持池中每個cpu只有一個線程,並且只有當其中一個活動線程被阻塞時纔會創建新線程。 – 2009-12-02 02:36:12
如果您創建另一個線程,並且之前被阻止的線程再次喚醒,該怎麼辦?聽起來就像你試圖微觀管理貓放牧一樣。 – 2009-12-02 07:48:35