http://www-aix.informatik.uni-tuebingen.de/en_US/a_doc_lib/aixprggd/genprogc/writing_reentrant_thread_safe_code.htm
稍微整理一下:
- Re-entrant表示允許程式碼可以重複進入
- Thread-safe表示同樣一段code可以安全的再多執行緒(multi-thread)之下執行
- 重複進入
- 多執行續
一般來說,interrupt handler,signal handler或是recursive call的時候要考慮到re-ntrant的特性,而thread safe的code需要保護的地方則是在當有公用的資料需要被多個執行緒存取的時候,都只存取local變數的函式通常也都是thread safe的。
舉例來說,c函式庫中的strtok就不是一個re-entrant的function,因為每次呼叫他的時候他都會根據上次的狀態來回傳給你是否還有下個token,這表示了在這個function的實做中英該有利用到static變數。
一個典型的re-entrant function大概是像這樣:
void func_r(int a, int *b)
{
*b = a * a;
}
而一個thread-safe的function大概是這樣:
int func_t()
{
static int aaa[5];
int i;
semaphore_take();
for(i = 0 ; i < 5 ; i++){
aaa[i] = i;
}
semaphore_give();
return 0;
}
沒有留言:
張貼留言