非同步可重入函式與執行緒安全函式等價嗎?

時間 2021-05-06 12:11:31

1樓:slight

可重入與執行緒安全兩者概念雖然表面上看有些許交集,但實際上完全是在描述函式的兩個不同的特性,完全可以理解為兩個截然不同的概念。

所謂函式重入是指乙個函式在執行完畢前由於某種原因被中斷,在中斷處理程式中該函式被再次呼叫的情況下,函式在不被上述中斷影響下的執行結果與出現上述中斷情況下的最終執行結果一致。

所謂執行緒安全函式在某種程度上可以簡單理解為n個執行緒同時執行該函式,全部執行緒執行完畢後的結果與這n個執行緒依次單個執行該函式完畢後結果一致。

既然是兩個截然不同的概念,他們之間其實並沒有什麼必然的聯絡。可重入不一定執行緒安全,執行緒安全也不一定可重入。

2樓:Acjx

兩者不等價。可重入更嚴格。

如果乙個函式的實現使用了全域性或者靜態變數,那麼這個函式既不是可重入的,也不是執行緒安全的。

如果放寬條件,這個函式仍然用到了全域性或者靜態變數,但是在訪問這些變數時,通過加鎖來保證互斥訪問,那麼這個函式就可以變成執行緒安全的函式。但它此時仍然是不可重入的,因為通常加鎖是針對不同執行緒的訪問,對同一執行緒可能出現問題(發生訊號軟中斷,signal handler中恰巧也執行了該函式)。

那麼如果把函式中的全域性和靜態變數都乾掉,並保證在該函式中也不呼叫不可重入的函式,那麼這個函式可以做到既是執行緒安全的,也是可重入的。

綜上,可重入函式一般都是執行緒安全的,執行緒安全的不一定是可重入的。

3樓:伊卡洛斯

深入理解可重入與執行緒安全,看完這篇就比較清楚了。

補充一篇,執行緒安全、異常安全、可重入 - shuaihanhungry - 部落格園

4樓:陳碩

Linux 中可重入這個概念一般只有在 signal 的場景下有意義,叫 async-signal-safe。

很多執行緒安全的函式都是不可重入的,例如 malloc。

可重入的函式一般也是執行緒安全的,雖然據說有反例,但我沒見過。

Posix中大多數函式都是執行緒安全的,但只有少數是 async-signal-safe。

見《Linux多執行緒服務端程式設計》第4.2節和第4.10節。

5樓:

非同步可重入跟執行緒安全不是一回事,雖然有時候兩者同時滿足。

樓上有人指出嚴格的可重入應該滿足執行緒安全,這也許是實際中常見的情形。另外@vczh 說執行緒安全滿足事務要求似乎也嚴格了些。

@董俊傑 提到可重入部分不能掛起也是現實中常見要求。

為了一致性避免所有這些問題,選擇lockfree的資料結構是發展趨勢。

6樓:Geek An

可重入函式是執行緒安全函式的子集。

可重入的要求是:不使用、返回任何非常量的全域性|靜態變數,也不呼叫任何不可重入的函式。

執行緒安全的要求是:在多個執行緒同時呼叫乙個函式時,能夠得到預期的結果。

執行緒安全函式,在執行時,多個執行緒可以互相影響,即使輸入一樣,輸出也可能因為函式中途其他執行緒的行為而改變,所以函式返回值不具有可再現性(輸入輸出一一對應),也不一定是可重入函式了。

使用msgbox函式與msgbox過程可以接受使用者輸入的資料嗎?

趙昕 從語法來看 MsgBox Prompt Buttons Title Helpfile,Context 當然prompt,Buttons,Title及Helpfile,Context可以用變數傳遞,如用變數pp bt tt hf ct分別傳遞各部分,pp 發生錯誤,是否繼續?bt vbYesNo...

執行緒同步 非同步 與 I O同步 非同步 中的同步 非同步描述的是同乙個概念麼?

純果樂 I O應該是阻塞和非阻塞。同步非同步阻塞非阻塞,是兩組不同的概念。非阻塞和同步完全可以並存,比如select,poll,epoll等 快樂領讀 同步IO 指,你乙個請求下去,要等待返回,才能做下一步。執行緒同步是說,2個執行緒一起幹活的時候,是要配合好的,不能各自忙各自的,使用synchro...

乙個可積函式乘以乙個可積函式是否還是可積函式?

香草 黎曼可積充要條件是不連續點是零測集,所以黎曼情況下沒問題。如果是L可積,有反例,定義在 0,1 的 1 x 這個函式平方L不可積。 dhchen 如果是閉區間上的黎曼可積函式,那麼兩個相乘的確是可積的。這一點在一般的書上都有,比如rudin的那本 數學分析原理 上就有。如果是勒貝格可積 或者說...