2009年11月20日 星期五

Re-entrant and thread-safe

看了一篇文章:
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)之下執行
有點難懂,先來說明一下
  1. 重複進入
  2. 多執行續
re-entrant code表示該段程式碼可以重複進入(無論是在多執行緒的狀況下),一般而言,re-entrant safe的code只能利用local變數或者是使用caller傳進的記憶體空間作操作,而thread safe的code通常都是利用semaphore之類的lock來保護critical section.

一般來說,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;
}

沒有留言:

張貼留言