2013-10-27 53 views
0

運行一段代碼的線程可能在該代碼塊中更改嗎?我的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

+0

你不能得到這樣的保證,自定義的CLR主機被允許以他們認爲合適的方式實現線程。線程池也是一個可定製的項目。當然,你會擺脫它。無論如何。 –

回答

0

簡短的回答是否定的。沒有同步功能會做到這一點。

充足的聰明和邪惡,你可以創建一個功能,做到這一點。但是,你會期望它破壞事物,這就是爲什麼沒有人真的這樣做。

只是最明顯的問題 - 如果調用線程在同步調用期間持有鎖,會發生什麼情況?