4

私は、それを呼び出すさまざまなスレッドに一意の乱数を生成する関数を持っています(基本的には前をインクリメントします)。

これはスレッドセーフですか、それとも再入可能ですか。この番号に静的変数を使用したと仮定します。

このフォーラムで、再入可能/スレッドセーフに静的変数を使用できないことを見てきました。

ローカル/グローバル静的に適用されますか。

または、実装定義です。

4

2 に答える 2

4

スレッド間で共有される「通常の」オブジェクトの変更は、特別な注意を払わない限り、決してスレッド セーフではありません。(そして、静的に宣言された変数はすべてそのカテゴリに分類されます)。それを処理する2つの標準的な方法があります

  • ミューテックスまたはその他のロック構造を使用して、「クリティカル セクション」内の共有オブジェクトを保護します
  • アトミック操作を使用してオブジェクトにアクセスします。新しい C 標準、C11 にはこのためのインターフェイスがあります。

再入可能であることは、実行 (スレッドがなくても) が状態の一部を変更できるかどうかを尋ねます。例としては、再帰、シグナル ハンドラー、 または を使用したジャンプがありgotoますlongjmp。「自分」と変数を共有していると考えてください。静的に割り当てられた変数は、プログラムの別の場所から変更すると、ここで同じ問題を引き起こします。

于 2013-05-02T21:40:42.127 に答える