2

POSIX による再入可能性の次の拡張定義を考慮してください。

POSIX.1c では、「再入可能関数」は「2 つ以上のスレッドによって呼び出された場合、各スレッドが定義されていない順序で関数を次々に実行したかのように、その効果が保証される関数」として定義されます。実際の実行はインターリーブされます」(ISO/IEC 9945:1-1996、§2.2.2)。

ソース: http://www.unix.org/whitepapers/reentrant.html

スレッドセーフ関数は同時実行をシリアル化するため、「実際の実行がインターリーブされていても、各スレッドは未定義の順序で関数を次々と実行する」ため、スレッドセーフ関数が再入可能であることを意味しますか (のみ) POSIX 定義を考慮)?

4

3 に答える 3

1

スレッドセーフコードは同時実行をシリアル化する必要はありません。このため、引用したPOSIX定義によれば、スレッドセーフ関数を再入可能にする必要はありません。

次の例を考えてみましょう。2 つのスレッドセーフ関数があります。

void inc_count(struct counter* cnt);
int get_count(struct counter* cnt);

これら 2 つを使用して、別のスレッド セーフ関数を定義できます。

inc inc_and_get_count(struct counter* cnt) {
   inc_count(cnt);
   return get_count(cnt);
}

そのような関数の契約は、戻り値が inc_count() が設定した値と等しいことを保証しません。それよりも大きくなる可能性がありますが、関数は依然としてスレッドセーフです。

ただし、定義によれば、再入可能ではありません。2 つの異なるスレッドから関数を 2 回呼び出すと、同じ値が返される可能性があります。これは、実行がシリアル化されている場合には決して起こりません。

于 2013-05-31T10:47:38.963 に答える