15

C の関数内で静的変数を宣言するということは、この変数が関数呼び出し間でその状態を保持することを意味することを知っています。スレッドのコンテキストでは、これにより、変数が複数のスレッドにわたってその状態を保持するか、または各スレッド間で個別の状態を持つことになりますか?

これは、私が答えるのに苦労している過去の紙の試験問題です。

次の C 関数は、呼び出し元に一意の識別子 (UID) を割り当てるために使用することを目的としています。

get_uid() 
{
static int i = 0;
return i++;
}

get_uid() が複数のスレッドによって呼び出されている環境で、どのように正しく動作しないかを説明してください。特定のシナリオ例を使用して、そのような不適切な動作が発生する理由と方法を具体的に説明してください。

現時点では、各スレッドが変数に対して個別の状態を持っていると想定していますが、それが正しいかどうか、または答えが相互排除の欠如と関係があるかどうかはわかりません。その場合、この例でセマフォをどのように実装できますか?

4

6 に答える 6

20

あなたの仮定 (スレッドには独自のコピーがある) は正しくありません。コードの主な問題は、複数のスレッドがその関数を呼び出すときに、どのスレッドがインクリメントして一意ではない可能性がある ID を取得するかについて競合状態get_uid()が発生する可能 性があることです。i

于 2013-04-07T01:08:17.717 に答える
3

いいえ、値が使用されるスレッドに依存する変数が必要な場合は、Thread Local Storage を確認する必要があります。

静的変数です。完全にグローバルな変数のように想像できます。それは本当にほとんど同じです。したがって、そのアドレスを知っているシステム全体で共有されます。

EDIT:また、コメントが思い出させるように、この実装を静的変数として保持すると、競合状態により、値iが複数のスレッドによって同時にインクリメントされる可能性があります。つまり、値がまったくわからないことを意味します関数呼び出しによって返されます。このような場合、ミューテックスクリティカル セクションなどのいわゆる同期オブジェクトによってアクセスを保護する必要があります。

于 2013-04-07T01:03:21.983 に答える