2010-01-26 128 views
1

我在這裏閱讀了許多關於線程安全性和重入性問題的答案,但是當我思考它們時,想到了更多的問題,因此提出了這個問題。併發執行/重入/線程安全/?

1.)我有一個可執行程序說一些* .exe。如果我在命令提示符下運行這個程序,並且它正在執行,我在另一個命令提示符下運行相同的程序,那麼在什麼情況下結果可能會被破壞,也就是說這個程序的代碼應該是可重入的還是應該是線程安全嗎? 2.)當定義重入時,我們說當程序已經運行時,程序可以重新進入,在什麼情況下函數可以重新進入(除了遞歸程序,我不是在說話遞歸執行)。必須有一些線程才能再次執行相同的代碼,或者再次輸入該函數的方式?

3.)在實際情況下,兩個線程是否會執行相同的代碼,即執行相同的功能。我認爲多線程的想法是同時執行不同的功能(在不同的核心/處理器上)。

對不起,如果這些查詢看起來不同,但他們都發生在我身上,同時當我讀到關於SO的線程安全Vs折返帖子,因此我把它們放在一起。

任何指針,閱讀材料將不勝感激。

謝謝,

-AD。

回答

0
  1. 兩個進程不能共享內存。所以線程安全在這裏是沒有意義的。

  2. 重入意味着一個方法可以同時由兩個線程安全地執行。這不需要遞歸 - 線程是獨立的執行單元,並且不會讓它們同時嘗試運行相同的方法。

  3. 線程的好處可以通過兩種方式發生。一種是當你同時執行不同類型的操作時(比如在當時運行cpu密集型代碼和I/O密集型代碼)。另一個是你可以在多個處理器之間劃分長期運行的操作。在後一種情況下,兩個線程可能在不同的輸入數據集上同時執行相同的功能。

+0

這不是重新進入:重入只不過是一些函數/方法同時執行多次的能力,仍然返回有效值的輸入參數。 – Mavrik 2010-01-26 18:26:45

+0

是的,的確如此,雖然說「那不是重入」是不正確的。這個詞有兩個定義,我沒有意識到。看到我更新的答案。 – danben 2010-01-26 18:28:08

1

我會盡力解釋這些,爲了:

  1. 每個程序在自己的進程中運行,並得到其自己獨立的內存空間。在這種情況下,您不必擔心線程安全。 (但是,如果進程都訪問某個其他共享資源(如文件),則可能會有不同的問題,例如,進程1可能會「鎖定」數據文件,從而阻止進程2打開它)。

  2. 這裏的想法是兩個線程可能會嘗試同時運行相同的例程。這並不總是有效的 - 以多線程可以使用相同類的相同實例或相同靜態函數的方式定義類或進程時需特別小心,不會出現錯誤。這通常需要課堂同步。

  3. 兩個線程通常執行相同的代碼。線程化時有兩種不同的概念方式來劃分你的工作。你可以考慮任務 - 即:一個線程執行任務A而另一個執行任務B.或者,您可以根據數據來分解問題。在這種情況下,您需要處理大量的集合,並且每個元素都使用相同的例程進行處理,但處理過程並行進行。欲瞭解更多信息,你可以閱讀我寫在Decomposition for Parallelism上的博客文章。所有的

+0

@ Reed:感謝您的博客文章指針。 – goldenmean 2010-01-26 18:25:50

+0

@goldenmean:沒問題。該系列(進行中)非常面向.NET,但分解帖子是語言中立的,所以我認爲這可能有助於解釋這個問題。 – 2010-01-26 18:27:49

0

首先,我強烈建議你看一下計算機系統的一些基本的東西,尤其是如何一個進程/線程是在CPU執行,並通過操作系統調度。例如,虛擬地址,上下文切換,進程/線程概念(例如,每個線程都有自己的堆棧和寄存器向量,而堆被線程共享。線程是一個執行和調度單元,因此它保持代碼的控制流。 ) 等等。所有的問題與理解有關如何你的程序實際上在CPU上工作

1)和2)已經回答。

3)多線程只是併發執行任意任意線程。相同的代碼可以由多個線程執行。這些線程可以共享一些數據,甚至可以進行很難找到的數據競爭。當然,很多時候線程正在執行單獨的代碼(我們稱它爲線程級並行)。

在這方面,我已經使用併發作爲兩個含義:(a)在單個處理器,多線程共享單個物理處理器,但操作系統給出了那種線程併發運行的錯覺。 (b)在多核中,是的,物理上可以同時執行兩個或更多線程。

具體瞭解併發/並行執行需要相當長的時間。但是,你已經有了一個堅實的理解!