0

コード内に、関数静的オブジェクトが一度作成され、その関数が呼び出されるたびに使用(コピー)される場所がいくつかあります。これらの関数の1つは、任意のスレッドから呼び出すことができます。この関数は、この静的オブジェクト以外の共有状態にはアクセスしません。

スレッド1が初めて関数を呼び出すと、オブジェクトが作成され、初期化されます。ただし、(運が良ければ)プログラムがスレッド2に切り替わり、初期化が完了する前に同じ関数を呼び出すという繰り返しのケースがあります。オブジェクトは、不正なデータとともに割り当てられ、使用されています。

これをどう処理するかわかりません。初期化コードでクリティカルセクションを使用していますが、それも問題ではありません。このオブジェクトは、最初に初期化される前に使用されています。

__declspec(thread)を使用してこのスレッドをローカルにしようとしましたが、オブジェクトでは機能しないようです。

全体をクリティカルセクションで囲むこともできますが、それが最善の解決策かもしれませんが、コードの他の部分でこのような問題が発生するのではないかと心配しています。一般的な解決策があると便利です。

4

2 に答える 2

2

Windowsを使用している場合は、InitOnceExecuteOnceAPIを使用できます。詳細については、このRaymondChenの投稿をご覧ください。より一般的なstd::call_onceも見てください

于 2012-07-27T21:45:03.300 に答える
1

オブジェクトでセマフォを使用して、オブジェクトの作成時にセマフォをすでに1に設定し、オブジェクトが初期化された(そして使用できるようになる)ときにセマフォをゼロにデクリメントすることができませんでした。

ただし、リソースの不足に注意する必要があります。

于 2012-07-27T21:36:02.253 に答える