F#中有否可以檢測到當前正在等待的線程是否等待太久而未被聯繫?等待時間過長的干涉線程
我有一種情況,線程必須積極聯繫其他等待線程,以便在完成工作後將其工作傳遞給它們。我的解決方案有一個錯誤,有時候一個或多個線程會等待太久,最終程序會死鎖,因爲其他線程不會聯繫它們。
我想通過檢測一個等待線程是否僅僅等待太久,它會主動尋找可用的工作,而不是等待其他線程傳遞給它。
F#中有否可以檢測到當前正在等待的線程是否等待太久而未被聯繫?等待時間過長的干涉線程
我有一種情況,線程必須積極聯繫其他等待線程,以便在完成工作後將其工作傳遞給它們。我的解決方案有一個錯誤,有時候一個或多個線程會等待太久,最終程序會死鎖,因爲其他線程不會聯繫它們。
我想通過檢測一個等待線程是否僅僅等待太久,它會主動尋找可用的工作,而不是等待其他線程傳遞給它。
這可能會更好地嘗試和理解爲什麼你的線程卡住,而不是終止它們。如果您可以通過附加的Visual Studio調試器重現此問題,則可以單擊「暫停」按鈕並使用「線程」窗口查看所有線程都在使用哪個代碼。
這就是說;如果你仍然需要這樣做,解決方案將取決於你如何管理你的線程。爲了從外部監控它們,您需要一些具有線程列表並能夠判斷它們是否死機的進程。
Thread
類似乎沒有任何內置的機制來共享線程與其控制之間的狀態,除了Name
。你可能會濫用名字,但我可能有一個線程安全的集合(例如,一個ConcurrentDictionary<Thread, DateTime>
)來存儲所有的線程和他們上次通信的時間戳,並且在每個線程啓動時將Action
傳遞給它們,以允許它「Ping
」通過定期調用該操作。該操作只會更新針對該線程存儲的DateTime
。
控制過程然後只是定期掃描字典中的任何時間戳太舊的任何東西,聲明線程死了,並且Aborts()
它。
很難給出一個代碼示例,而不知道如何產生線程,並更詳細地描述「正在聯繫」線程的含義。
取決於您如何等待,但通常情況下,等待功能有某種您可以設置的超時時間。請參閱:http://msdn.microsoft.com/en-us/library/cc189907(v=vs.110).aspx –