2013-08-05 48 views
0
  • 當TThread進入Synchronized()方法時,它會等待,直到EnterCriticalSection(ThreadLock)返回。

現在,哪一個會運行該方法,如果在此期間,另一個T線程,甚至是主線程調用等待T線程的某種方法?
哪個線程將運行TThread實例的方法? (在等待模式下)

+0

也許你可以給你想叫什麼一個具體的例子。例如,調用'Free'並不安全。如果你舉一個具體的例子,那麼誤解的範圍就會減小。沒有一個具體的例子,沒有單一的答案。有些方法可以打電話,有些不會。這取決於。這是你想要的答案嗎?我非常懷疑。 –

回答

2

如果在此期間另一個線程甚至主線程調用等待線程的某些方法會發生什麼?

線程沒有方法,所以這個問題不是一個問題。

這是沒有意義的問,當你調用另一個線程的方法會發生什麼。因爲這是不可能的。當你調用一個方法時,該方法在調用它的線程上執行。

類似TThread.Synchronize計劃的方法將代碼執行到不同的線程上。但是,TThread.Synchronize的主體由調用者的線程執行。

EnterCriticalSection的呼叫不能由用戶模式代碼被中斷。所以,假設線程A在線程B持有鎖的地方調用EnterCriticalSection。線程A上的EnterCriticalSection調用在線程B釋放鎖之前不會返回。當線程A被阻塞,等待獲取鎖,沒有代碼將在線程A執行


看來,從意見澄清,你的問題其實是:

當方法TThread被調用,該方法在哪個線程上執行?

答案是,該方法被調用線程上執行。 TThread類沒有什麼特別之處,所以正常規則適用。

+0

我想你誤會了。 TThread繼承自TObject,所以它當然可以有方法。線程本身沒有方法,我應該編輯這個問題。 – EProgrammerNotFound

+0

我不認爲我誤解了你寫的內容。也許你寫的不是你的意思。肯定'TThread'有方法。但這不是你寫的。你寫了「等待線程的方法」。類'TThread'和a *線程*有很大的區別。 –

+0

我知道,你已經回答了我想知道的內容,你說的是在調用者的情況下執行的。 TThread是BeginThread(在Windows上)的包裝。 – EProgrammerNotFound