2008-11-13 35 views
1

我通常在單線程應用程序上工作,並且一般從來沒有真正煩惱處理線程。我對事物如何工作的理解 - 當然可能是錯誤的 - 只要我們總是處理單線程代碼(即沒有分叉或類似的東西),它總是會在同一個線程中執行。我可以確定我寫的代碼總是在同一個線程中執行嗎?

這個假設是否正確?我有一個模糊的想法,UI庫/框架可能會產生自己的線程來處理GUI的東西(這說明了Windows任務管理器告訴我,我的'單線程'應用程序實際上運行在10個線程上),但我猜猜這不應該影響我?

這如何適用於COM?例如,如果我要在代碼中創建一個COM組件的實例,並且COM組件將一些信息寫入基於線程的位置(例如使用System.Threading.Thread.GetData),我的應用程序能夠獲取該信息嗎?

因此,在總結:

  1. 在單線程代碼,我可以肯定的是無論我存儲在一個基於線程的位置可以檢索來自其他地方的代碼?

  2. 如果單線程代碼要創建存儲的一些信息在一個基於線程的位置的COM組件的實例,可以說是從其他地方類似的檢索?

回答

2

UI通常有相反的約束(黯然):它是單線程的,一切必須發生在該線程。

檢查你是否總是在同一個線程(例如,一個函數)最簡單的方法是將一個整數變量設置爲-1,並有一個檢查函數(比如你在C#中):

void AssertSingleThread() 
{ 
    if (m_ThreadId < 0) m_ThreadId = Thread.CurrentThread.ManagedThreadId; 
    Debug.Assert(m_ThreadId == Thread.CurrentThread.ManagedThreadId); 
} 

這就是說:

我不明白的問題#1,真的。如果你的目的是要有一個全局範圍,爲什麼要存儲在一個基於線程的位置?

關於第二個問題,大多數COM代碼都運行在單個線程上,並且最經常在UI消息處理所在的線程上運行 - 這是因爲大多數COM代碼被設計爲與單線程VB6兼容。

你的程序有大約10個線程的原因是因爲Windows(如果你使用它的一些功能,比如完成端口或者某種定時器)和CLR(例如GC或者某些類型的定時器)可能在您的進程空間創建線程(技術上任何具有足夠特權的程序都可以)。

+0

你是對的,問題一個是非常愚蠢的。基本上,我想確保我的代碼在整個線程上運行。 – jpoh 2008-11-13 09:47:25

0

考慮讓您的mainThread中運行一個數據倉庫類的模型,即所有線程都可以讀寫它們的實例變量。這將避免可能會在整個店鋪訪問線程的許多問題。

簡單的想法,直到你到達線程的樂趣的一部分。併發和同步;簡單地說,如果您有兩個線程想要同時讀取和寫入dataStore中的相同變量,則會出現問題。

Java通過允許您聲明同步的變量或方法來處理此操作,一次只允許一個線程訪問。

我相信一些.NET對象具有定義在它們上的鎖定和同步方法,但我只知道這一點。

相關問題