我看到了這樣的一段代碼,不知道這是否是線程安全的:此代碼不是線程安全的,不是嗎?
int savedErrno = errno;
//call some function that may modifies errno
if (errno == xxx)
foo();
errno = savedErrno;
我不認爲這是線程安全的,對嗎?
但我看到有人寫這樣的代碼,所以我不知道......
任何一個可以幫助我澄清這一點,謝謝...
我看到了這樣的一段代碼,不知道這是否是線程安全的:此代碼不是線程安全的,不是嗎?
int savedErrno = errno;
//call some function that may modifies errno
if (errno == xxx)
foo();
errno = savedErrno;
我不認爲這是線程安全的,對嗎?
但我看到有人寫這樣的代碼,所以我不知道......
任何一個可以幫助我澄清這一點,謝謝...
每個線程都有自己的(線程專用) errno的副本,使它看起來應該是安全的。
從人(3)錯誤號:
錯誤號是由ISO C標準定義爲int類型的修改的左值,並且不能明確聲明; errno可能是一個宏。 errno是線程本地的;在一個線程中設置它不會影響其在任何其他線程中的值。
嗨,鴨 現在我很清楚 – kai
代碼只在一個線程中使用errno,實際上代碼只顯示一個線程。 所以,這個片段是線程安全的。
爲什麼它不安全? – littleadv
你從哪裏看到不安全的部分? – ScarletAmaranth
@littleadv它看起來不是線程安全的原因是因爲它看起來像errno是一個全局變量,因此被所有線程共享。我認爲這是最初的情況,直到聰明的系統實現者通過用一些宏魔術替換全局變量來「修復它」,以使得errno成爲每個線程局部變量。它仍然是一個醜陋的機制,雖然國際海事組織... –