3
A
回答
3
這些之間幾乎沒有什麼區別,都是等待不同的內核對象。
「等待」我假設你的意思是「I/O等待」。 「加入」只是「等待線程/進程」。 而「睡眠」是「等待一個計時器」。
更復雜的是,一個線程可能正在等待一些內核對象的組合。
您可以使用內核調試器找出線程正在等待什麼對象以及這些對象的類型。我不認爲有任何簡單的方法。
2
沒有直接的等價物 - 管理和非管理線程不應該被視爲相同。見here。
的操作系統的ThreadId具有到管理 線程沒有固定的關係,因爲非託管主機可以控制 管理和非管理線程之間的關係。具體而言,一個複雜的主機可以使用光纖API來針對同一個操作系統線程調度多個託管線程,或者在不同的 操作系統線程之間移動託管線程。
1
使用winapi可以輕鬆訪問的本地線程的唯一狀態是知道線程是否已完成其執行。只需使用功能WaitForSingleObject()
與線程處理和0超時:
DWORD res = WaitForSingleObject(handleThread, 0);
switch (res)
{
case WAIT_OBJECT_0:
printf("The thread has finished\n");
break;
case WAIT_TIMEOUT:
printf("The thread is still running\n");
break;
default:
printf("Unknown error (shouldn't happen)\n");
break;
}
1
「問題」是,.NET運行時有你的.NET線程的所有權。因此,例如,當您調用Abort時,運行時內部函數會在.NET線程的.NET上下文中拋出ThreadAbortException異常,這就是您可以使用catch(ThreadAbortException)在線程中捕獲它的方式。
對於ThreadState也是如此,因爲它具有線程的基礎所有權,它確切知道它在做什麼,因此可以生成有效的線程狀態。
由於沒有非黑客的方式來正式查詢線程的內部狀態,所以可以將其包裝在一個類中。但是,你會完全依賴線程方法來堅持任何.Abort() - 請求。
相關問題
- 1. ManagementObjectSearcher增加了在等待,睡眠一個新的線程或加入狀態
- 2. 消息「當前線程處於睡眠,等待或加入狀態」 - 鎖定?
- 3. 睡眠或等待()
- 4. 繼續在VS2010調試,而所有線程都在睡眠,等待或加入
- 5. 當前線程在等待另一個線程時睡眠
- 6. 等待或睡眠或東西
- 7. 如何使用JS或jQuery添加睡眠或等待JS?
- 8. 確定線程是否正在睡眠
- 9. Threadreference.isalive = true,但是在線程窗口中它的位置是[在睡眠中,等待或加入]
- 10. 睡眠()或睡眠()的準確程度
- 11. C#線程的狀態和「睡眠」
- 12. 睡眠或等待For循環
- 13. 如何爲我的Lua腳本添加「睡眠」或「等待」?
- 14. 線程等待睡眠並通知
- 15. 進程間通信fork() - 定時等待()和/或睡眠()
- 16. C#線程休眠或等待,直到有工作MUTEX或MONITOR
- 17. 把幾個線程放在睡眠/等待不使用Time.Sleep()
- 18. 適當的睡眠方式在等待鎖定期間睡眠
- 19. iphone SDK - 關閉應用程序和/或進入睡眠狀態
- 20. 讓線程進入睡眠狀態(c pthreads)
- 21. .NET Stopwatch是否等待/睡眠/休眠?
- 22. 睡眠和/或鎖定後的Windows Phone應用程序狀態
- 23. 如何確定一個進程是在java或c或c + +進程在Linux?
- 24. 關於java線程的睡眠狀態
- 25. 睡眠線程處於什麼狀態?
- 26. 一個線程中的Thread.sleep()使UI線程也進入睡眠狀態
- 27. 如何跟蹤Windows 7是否在Windows XP中以編程方式進入睡眠或休眠狀態?
- 28. Java在我的情況下等待或睡眠
- 29. 睡眠在JavaScript(或同等學歷)
- 30. Java中的睡眠線程或進程
NtQuerySystemInformation()但它沒有記錄。只有書面的方式是Win32_Thread類的WMI。 –
謝謝大家爲你解答我真的很感謝你的努力!但是,我正在尋找像BOOL IsThreadInWaitJoinSleep(HANDLE threadHandle)?還有其他建議嗎? – Honzajscz
你不明白。同樣的原因,你不能發現一個文件被鎖定而沒有實際嘗試打開它。因爲這樣的操作在多任務操作系統上絕對無法使用。一納秒後,文件可能被鎖定。或者線程可能被阻塞。 –