Re: [問題] reentrant vs. thread-safety

看板C_and_CPP (C/C++)作者 (「雄辯是銀,沉默是金」)時間12年前 (2013/11/20 11:16), 編輯推噓4(4011)
留言15則, 7人參與, 最新討論串2/2 (看更多)
pthread 多緒程式設計 (p237) 關於這問題的描述, 簡單提一下 (詳細請參閱該書籍): reentrant function: 不可使用 static, global data thread safe: 使用 mutex 來保護 global data, 而 data 不一定是變數, 可能是檔案, 可能是某個週邊。 ref: http://blog.xuite.net/jackie.xie/bluelove/46644355 可重入與執行緒安全這兩個概念,都與函數處理資源的方式有關。可重入與執行緒安全是 兩個獨立的概念,一個函數可以是可重入或是執行緒安全,或是同時滿足兩者,或是同時 不滿足兩者的。 這我比較想不懂, 我以為 thread safe 就一定也是 re-entrant。 ※ 引述《nikeasyanzi (nikeasyanzi)》之銘言: : 這比較像是OS的問題 : 但還是PO上來問問 : 想請問一下 reentrant vs. thread-safety 的差別 : 小弟我上網去看了一下 http://0rz.tw/dwWTD : 但我困惑的是 網頁給出如下說明 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.239.46

11/20 12:22, , 1F
The Old New Thing 網站那篇文中的 AddToString 函數不就
11/20 12:22, 1F

11/20 12:23, , 2F
已經證明,可以是 thread safe 但不滿足 re-entrant 了
11/20 12:23, 2F

11/20 12:33, , 3F
是因為那個全域變數 s 的關係嗎?
11/20 12:33, 3F

11/20 12:43, , 4F
AddToString('\0')跟AddToString('\\')是假設要處理卻會出問題
11/20 12:43, 4F

11/20 12:43, , 5F
拿一個有bug的code來說明很怪...
11/20 12:43, 5F

11/20 12:59, , 6F
因為 thread-safe 不保證同個 thread 多次進入不會出問題
11/20 12:59, 6F

11/20 12:59, , 7F
簡單的例子, 當收到 SIGNAL 的時候有可能你正在 lock 裡
11/20 12:59, 7F

11/20 13:00, , 8F
結果 handler 又 call 一次你的 thread safe func 就炸了
11/20 13:00, 8F
這不是說明前一個 thread 還沒取得 lock, 後一個 thread 才會完成取得 lock 的動作, 並順利執行, 這樣會有問題嗎? ※ 編輯: descent 來自: 59.125.239.51 (11/20 14:42)

11/20 18:46, , 9F
Ebergies 的意思是「同一個」thread 喔
11/20 18:46, 9F

11/20 22:01, , 10F
假設你的程式在釋放mutex前就遞迴就沒法reentrant啦
11/20 22:01, 10F

11/25 09:00, , 11F
文中提到re-entrant 比thread-safe更強,是不是可以理
11/25 09:00, 11F

11/25 09:01, , 12F
解為 reentrant必為thread-safe? 有thread-unsafe 但
11/25 09:01, 12F

11/25 09:01, , 13F
reentrant 的例子嗎?
11/25 09:01, 13F

11/25 09:04, , 14F
怪的是文中說either, 但圖卻是reentrant 是threadsafe
11/25 09:04, 14F

11/25 09:05, , 15F
的子集(即不存在reentrant 但non-thread-safe)
11/25 09:05, 15F
文章代碼(AID): #1IZ2cXPv (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1IZ2cXPv (C_and_CPP)