2010-09-20 163 views
6

我今天參加了一個採訪,面試官問我以下問題:這些線程安全嗎?

是否重入和互斥線程安全?你能解釋爲什麼嗎?

我是比較新的並行編程,不能回答這個問題。但我說...

互斥是線程安全的。但重入不是,這就是我們重入鎖的原因。

面試官轉移到下一個問題,雖然到不同的區域...我想我搞砸這一個...

什麼是他希望我說的時候,他問我這個?

回答

5

正確的答案應該是:

是的,他們是執行線程安全。

重入

以這樣一種方式,它可以由一個任務被部分地執行,由另一個任務重新進入,然後編寫代碼從原始任務恢復。這需要將狀態信息保存在每個任務本地的變量中,通常在其堆棧上而不是靜態或全局變量中。

一例

互斥

訪問共享數據是使用機制,確保只有一個線程讀取或隨時寫入的共享數據進行序列化。如果一段代碼訪問多個共享的數據段,則需要非常小心 - 問題包括競態條件,死鎖,活鎖,飢餓以及許多操作系統教科書中列舉的各種其他弊病。

一個例子

+0

爲什麼一個投票??? – 2010-09-20 13:09:48

+0

(-1)重入不會暫停並恢復。一個函數是可重入的,如果它支持多個執行線程同時「通過」它,或者簡單地說,當另一個函數正在執行時,可以輸入函數。 – 2010-09-20 13:10:25

+0

http://en.wikipedia.org/wiki/Thread_safety http://stackoverflow.com/questions/352365/code-re-entrancy-vs-thread-safety – 2010-09-20 13:13:07

0

我引用http://en.wikipedia.org/wiki/Reentrant_(subroutine)

重入和線程安全的這兩個概念涉及到函數處理資源的方式。但是,它們並不相同。

儘管重入的概念會影響函數的外部接口,但線程安全只涉及函數的實現而不涉及其外部接口。

- 在大多數情況下,爲了使不可重入函數可重入,必須修改其外部接口,以便所有數據都由函數的調用者提供。

- 爲了使線程不安全的函數成爲線程安全的,通常需要添加同步塊來保護共享資源免受不同線程的併發訪問的影響。

因此,重入是一個比線程安全更根本的屬性,根據定義,導致線程安全:每個重入函數都是線程安全的;然而,並非每個線程安全函數都是可重入的。