2011-04-15 81 views
3

在Windows C++中,createThread()會導致某些線程減速,如果一個線程正在執行CPU密集型操作。 createProcess()會緩解嗎?如果是這樣,createProcess()暗示代碼必須駐留在第二個可執行文件中,還是可以在同一個可執行文件中執行?Windows C++進程與線程

+0

創建具有較低優先級的新線程,然後創建現有線程。但是,新線程將無法全速執行任務,因爲他將不得不將CPU釋放到另外兩個線程。 – RedX 2011-04-15 13:45:57

+3

「*在windows C++中,如果一個線程正在進行CPU密集型操作,則createThread()會導致某些線程變慢。」您從哪裏得到這個印象? – ildjarn 2011-04-15 13:46:18

+0

我看到它發生了。我有兩個線程正在運行。當線程A運行非常密集的算法時,線程B會顯着減慢。 – rossb83 2011-04-15 13:49:09

回答

9

進程和線程之間的主要區別在於每個進程都有自己的內存空間,而線程共享它們運行的​​進程的內存空間。

如果一個線程真正受CPU限制,它將只會減慢另一個線程,如果它們都在同一個處理器核上執行的話。 createProcess不會緩解,因爲一個過程仍然會有相同的問題。

另外,你在使用什麼樣的機器?它有多個核心嗎?

+0

4核心英特爾i7 – rossb83 2011-04-15 13:47:05

+1

如果你真的認爲你的進程是CPU綁定的,你可以嘗試設置每個線程的親和性:http://stackoverflow.com/questions/3366932/identify-processor-core-is-used-by -specific-thread但是由於這是一個4核心系統,所以似乎可能有其他的東西放慢了速度。你認爲線程之間可能存在爭用某種共享資源嗎?例如,線程在等待訪問共享數據結構時被阻塞? – 2011-04-15 13:53:09

+0

賈斯汀有趣的評論。這個評論的答案是,我不這麼認爲,但也許是這樣。是的,我有一個大型數組緩衝區,大小爲100 MB,聲明爲A =新字符[100 * 1024 * 1024]。我有線程一個寫入該緩衝區的開始,例如前10 MB,而線程B從緩衝區中的另一個位置讀取最後10 MB來執行密集處理。雖然它被聲明爲相同的數組,但兩個線程都在讀取和寫入數組的不同部分。這仍然是一個共享資源? – rossb83 2011-04-15 14:02:33

1

不太可能 - 一個過程比一個線程「重一點」,所以它可能會更慢。我不確定你在詢問第二個可執行文件,但是你可以在同一個.exe上使用createProcess。

http://msdn.microsoft.com/en-us/library/ms682425(v=vs.85).aspx

這聽起來像你追了一些性能問題,所以也許嘗試面向線程廓將是有益的:http://software.intel.com/en-us/articles/using-intel-thread-profiler-for-win32-threads-philosophy-and-theory/

0

創建過程,並創建線程都造成額外的執行什麼是一個資源有限的環境。這意味着無論您在某個時間點如何進行並行處理,您的其他執行線都會阻止當前的執行。正是出於這個原因,非常大的問題適合於平行分佈式系統的使用。有線程和進程的優缺點。


線程

線程允許一個地址空間,這意味着你可以很容易地共享對象的數據變量的情況下,內部獨立的執行,但是這也意味着你碰到更多的同步問題。這些都是痛苦的,正如你可以從api function的剪切數字看到的那樣不是一個輕的主題。線程在窗口上的重量較輕,因此處理速度更快,而且使用更少的資源進行維護。線程也受到影響,因爲一個線程可能導致整個過程失敗。


進程

過程各具有有自己的地址空間,因此保護自己免受由另一進程正在放倒,但缺乏容易地通信的能力。任何通信都必須涉及某種類型的IPC(管道,TCP,...)。

代碼不必在第二個可執行文件中,只需要運行兩個實例。

0

這會讓事情變得更糟。切換線程時,CPU只需要換出少量寄存器。由於進程的所有線程共享相同的內存,因此不需要刷新緩存。但是當在進程之間切換時,您也切換映射的內存。因此,CPU必須刷新L1緩存。這很痛苦。

(L2高速緩存的物理映射,即使用硬件地址。那些不改變,當然。)

+0

其中一個「線程」應該是「進程」 – 2011-04-15 14:08:30

+0

@ Ben Voight:謝謝,修正。 – MSalters 2011-04-15 14:13:43

1

每個過程提供執行程序所需要的資源。進程具有虛擬地址空間,可執行代碼,系統對象的打開句柄,安全上下文,唯一進程標識符,環境變量,優先級類別,最小和最大工作集大小以及至少一個執行線程。每個進程都使用單線程啓動,通常稱爲主線程,但可以從其任何線程創建其他線程。

線程是一個進程中的實體,可以安排執行。進程的所有線程共享其虛擬地址空間和系統資源。另外,每個線程維護異常處理程序,調度優先級,線程本地存儲,唯一線程標識符以及系統將用於保存線程上下文直到它被調度的一組結構。線程上下文包括線程的一組機器寄存器,內核堆棧,線程環境塊以及線程進程地址空間中的用戶堆棧。線程也可以有自己的安全上下文,可用於模擬客戶端。