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

4 に答える 4

15

はい、これはリエントラント関数です。再入可能関数は、それ自体が実行されている間に呼び出すことができる関数として定義されます(再帰または並行性のいずれかのため)。この場合、再帰は重要ではなく、同時に安全です(パラメーターが異なると仮定します)。

あなたの議論は大丈夫です-明示的または暗黙的にアクセスされているグローバルまたは共有状態がないので、再入可能性が保証されます。これは、明示的なコードとCのセマンティクスの両方の組み合わせです。他の言語やAPIにはこのプロパティがない場合があります。

編集:ダブルチェックでは、ISOC標準はstrlenのスレッドセーフを強制していないようです。そのため、スレッドセーフではないstrlenでC標準ライブラリを使用している可能性がわずかにあり、そのため、そこから非再入可能性を継承します。

于 2009-09-16T21:26:30.637 に答える
11

はい、その通りです。リエントラントです。パラメータとローカル変数にのみ影響します。

異なるインスタンスが干渉する可能性がある唯一の方法は、それらにポインターを同じバッファーに渡した場合です。

ウィキペディアにはリエントラントの適切な定義があり、あなたの関数は明らかにすべての条件を満たしています。

于 2009-09-16T21:25:13.150 に答える
4

はい、引数を変更するだけなので、再入可能です

ウィキペディアは、再入可能にするために何を提供する必要があるかについて、いくつかの良い点を提供しています。

再入可能であるためには、コンピュータプログラムまたはルーチン:

  • 静的(またはグローバル)非定数データを保持してはなりません。
  • アドレスを静的(またはグローバル)非定数データに返さないでください。呼び出し元から提供されたデータに対してのみ機能する必要があります。
  • シングルトンリソースへのロックに依存してはなりません。
  • 独自のコードを変更してはなりません。1(独自のスレッドストレージで実行する場合を除く)
  • 再入可能でないコンピュータプログラムまたはルーチンを呼び出さないでください。
于 2009-09-16T21:28:01.863 に答える
2

strlen再入可能であると想定(または検証)する必要があります(おそらくそうです)。

于 2009-09-16T21:33:16.580 に答える