運行一段代碼的線程可能在該代碼塊中更改嗎?我的CurrentThreadID可以改變嗎?
我特別想到在ASP.net中運行的代碼,其中針對線程池執行方法。
如果我的代碼啓動一個I/O操作(例如數據庫),那麼在I/O完成端口完成之前暫停執行。同時,該線程池線程可以重新用於處理另一個Web請求。
當我的I/O完成,並且我的代碼返回到線程池線程 - 它保證是相同的線程?
E.g.
private void DoStuff()
{
DWORD threadID = GetCurrentThreadID();
//And what if this 3rd party code (e.g. ADO/ADO.net) uses completion ports?
//my thread-pool thread is given to someone else(?)
ExecuteSynchronousOperationThatWaitsOnIOCompletionPort();
//Synchronous operation has completed
threadID2 = GetCurrentThread();
}
是否有可能爲
threadID2 <> threadID
?
我提到了.NET線程池,但也有本地線程池。我已經爲兩者編寫代碼。
是否曾經可能我ThreadID
從下我撕掉了?永遠。
爲什麼我在乎?
我關心的原因是因爲我試圖使對象線程安全。這意味着有時我必須知道所謂的「線程」的執行稱爲方法。後來,當他們回來時,我知道「他們」仍然是「他們」。
我知道識別「被編寫爲由一個虛擬處理單元」執行的一系列機器指令的唯一方式是通過GetCurrentThreadID
。但如果GetCurrentThreadID
發生變化;如果我的一系列機器指令可以在執行期間移動到不同的「虛擬處理單元」(即線程),那麼我不能依靠GetCurrentThreadID
。
你不能得到這樣的保證,自定義的CLR主機被允許以他們認爲合適的方式實現線程。線程池也是一個可定製的項目。當然,你會擺脫它。無論如何。 –