作者nikeasyanzi (nikeasyanzi)
看板C_and_CPP
標題[問題] reentrant vs. thread-safety
時間Tue Nov 19 01:59:21 2013
這比較像是OS的問題
但還是PO上來問問
想請問一下 reentrant vs. thread-safety 的差別
小弟我上網去看了一下
http://0rz.tw/dwWTD
但我困惑的是 網頁給出如下說明
An operation is re-entrant if it can be performed while the operation is
already in progress (perhaps in another context). This is a stronger concept
than thread-safety, because the second attempt to perform the operation can
even come from within the same thread.
並搭配在網頁給的範例 標示出紅色的部分即為不滿足的地方
int length = 0;
char *s = NULL;
// Note: Since strings end with a 0, if we want to
// add a 0, we encode it as "\0", and encode a
// backslash as "\\".
void AddToString(int ch)
{
EnterCriticalSection(&someCriticalSection);
// +1 for the character we're about to add
// +1 for the null terminator
char *newString = realloc(s, (length+1) * sizeof(char));
if (newString) {
if (ch == '\0' || ch == '\\') {
AddToString('\\'); // escape prefix
}
newString[length++] = ch;
newString[length] = '\0';
s = newString;
}
LeaveCriticalSection(&someCriticalSection);
}
但小弟還是不大懂意思? 就算某個thread重複執行這段code
但還是可以執行並得到正確結果不是嗎?
那為啥不能是reentrant?
於是乎我去查了一下reentrant 的定義
http://0rz.tw/qXdOI
該作者說明
1. 非 const 的區域或全域變數不可使用
2. return 值不可為非 const 的區域或全域變數
3. 僅依賴呼叫者提供的參數
4. 可重疊執行,所以沒有 Lock 的機制
5. function 內部呼叫的 function 也必須為 Reentrant
所以連結一的code 不是reentrant是因為理由四? 因為他有Lock機制?
那連結一裡說的"because the second attempt to perform the operation can
even come from within the same thread." 這句話是啥意思?
煩請版上先進指教 感謝!
--
CyberPanel 5000CP 換 NT.500
http://myurl.com.tw/05bd
EmailCash 5000e 換 NT.500
http://myurl.com.tw/rgdq
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.251.194.200
→ Feis:這範例怪怪的. 你的問題他最後一段有說明, 主要是 s 可能壞掉 11/19 02:27
→ Feis:realloc 可能將 s 原本指向的空間釋放,造成下一次 s 值不合法 11/19 02:31
→ Feis:不過這例子就怪怪的. 11/19 02:40
→ nikeasyanzi:意思是 我應該去找另外一個比較好的說明? XDXD 11/19 12:36