2009-09-16 37 views
1
void reverse_string(char* string, int str_size) { 
    char tmp; 
    int i = 0; 
    int j = str_size - 1; 
    while (i < j) { 
     tmp = string[i]; 
     string[i] = string[j]; 
     string[j] = tmp; 
     ++i; 
     --j; 
    } 
} 

我覺得這個函數是可重入的,因爲它沒有使用任何全局變量。它只修改參數。這個函數是可重入的嗎?

我的問題是: 這個函數是可重入的嗎? 如果是,我的論證是否足夠好?

在此先感謝

+4

我相信平等守衛'if(i == j)'是不必要的。你已經要求'i'嚴格小於'j'。 – dmckee 2009-09-16 21:50:58

+0

很好找。它被刪除 – Quincy 2009-09-16 22:51:02

+1

僅供參考,您可以使用std :: reverse(foo,foo + strlen(foo))實現相同的效果,其中「foo」是可變的字符串。 AFAIK中,大多數std :: reverse()實現在使用這種基本迭代器(即本例中的指針)時是線程安全的並且是可重入的。 strlen()評論其他已發佈,當然仍然適用。 – Void 2009-09-16 23:33:55

回答

14

是的,這是一個可重入函數。可重入函數被定義爲在它們自己正在執行時可以被調用的那些函數(或者歸因於遞歸或者併發)。在這種情況下,遞歸是沒有意義的,並且你是安全的(假設參數不同)。

你的論點沒有問題 - 沒有全局或共享狀態被顯式或隱式訪問,所以重入是確保的。這是顯式代碼和C的語義的組合。其他語言和API 可能沒有此屬性。

編輯:關於雙重檢查,ISO C標準似乎沒有強制strlen的線程安全。因此,您可能使用帶有非線程安全的strlen的C標準庫的可能性很小,因此可以從中繼承非重入。

11

是的,你說得對,這是折返。它隻影響它的參數和它的局部變量。

不同的實例可能會干涉的唯一方法是,如果您將指針傳遞給同一個緩衝區。

有一個很好的definition of reentrant on Wikipedia和你的功能明確符合所有條款。

4

是的,這是重入,因爲它只能修改其參數

Wikipedia提供什麼都被設置成折返一些漂亮點:

要折返,計算機程序或程序:

  • 必須不包含靜態(或全局)非常量數據。
  • 不得將地址返回到靜態(或全局)非常數數據。 只能在由調用者提供給它的數據上工作。
  • 不能依靠鎖定單身資源。
  • 不得修改自己的代碼。 1(除非在其自己的唯一線程存儲中執行)
  • 不得調用不可重入計算機程序或例程。
2

您需要假設(或驗證)strlen是可重入的(可能是)。

+1

他編輯了代碼示例,因此'strlen'不需要在這裏折返。 – mbx 2011-08-30 13:10:14

相關問題