2011-12-11 56 views
2

我看到了這樣的一段代碼,不知道這是否是線程安全的:此代碼不是線程安全的,不是嗎?

int savedErrno = errno; 

//call some function that may modifies errno 

if (errno == xxx) 
    foo(); 

errno = savedErrno; 

我不認爲這是線程安全的,對嗎?

但我看到有人寫這樣的代碼,所以我不知道......

任何一個可以幫助我澄清這一點,謝謝...

+0

爲什麼它不安全? – littleadv

+0

你從哪裏看到不安全的部分? – ScarletAmaranth

+0

@littleadv它看起來不是線程安全的原因是因爲它看起來像errno是一個全局變量,因此被所有線程共享。我認爲這是最初的情況,直到聰明的系統實現者通過用一些宏魔術替換全局變量來「修復它」,以使得errno成爲每個線程局部變量。它仍然是一個醜陋的機制,雖然國際海事組織... –

回答

9

每個線程都有自己的(線程專用) errno的副本,使它看起來應該是安全的。

從人(3)錯誤號:

錯誤號是由ISO C標準定義爲int類型的修改的左值,並且不能明確聲明; errno可能是一個宏。 errno是線程本地的;在一個線程中設置它不會影響其在任何其他線程中的值。

+0

嗨,鴨 現在我很清楚 – kai

1

代碼只在一個線程中使用errno,實際上代碼只顯示一個線程。 所以,這個片段是線程安全的。