這裏的代碼,IBM公司表示,一個片段是折返的:爲什麼這個代碼被認爲是可重用的,當OS中斷某個線程時究竟發生了什麼?
/* reentrant function (a better solution) */
char *strtoupper_r(char *in_str, char *out_str)
{
int index;
for (index = 0; in_str[index]; index++)
out_str[index] = toupper(in_str[index]);
out_str[index] = 0
return out_str;
}
對我來說,這個代碼是不可重入的,因爲循環計數器指數正在本地定義。如果操作系統在循環中斷這個線程,並且另一個線程調用這個函數,索引將會丟失。我錯過了什麼?爲什麼這段代碼被認爲是可重入的?
當操作系統中斷線程並在處理繼續時重新建立變量時,操作系統是否會將索引等局部變量的副本保存到線程堆棧中?
它似乎使這個功能重入索引必須作爲調用者提供的存儲接口的一部分。
是的,堆棧變量是線程本地的,如果有中斷,將會被保存。 – clcto
所以如果線程A調用這個函數並且在循環中被中斷,所以線程B可以調用相同的函數,那麼當線程A繼續時,所有的狀態信息線程A需要繼續,它的中斷將重新建立?發生這種情況是因爲當處理器中斷線程A時,它會將局部變量(如索引)保存到線程堆棧,然後在處理恢復時重新建立這些變量?因此從來沒有對函數和局部變量的爭用。 – brimaa
本地變量'index'沒有「保存」到堆棧。它首先在棧上生存。 –