数ヶ月前に、私は男(orkut)のこの面白いシナリオを尋ねました。しかし、私はこの問題(小さなコードでテストしたことがあります)に「移植性のない」ソリューションを考え出しましたが、依然として皆さんが何を言い、示唆しているかを知りたいと思います。シナリオ:マルチスレッドアプリケーションで使用されているDLLのグローバル変数
私はDLLを作成して、C++で書かれたいくつかの機能をエクスポートしました。はシングルスレッドクライアントです。このDLLは大量のグローバル変数を宣言しています。いくつかの変数はconst変数(読み取り専用)であり、その他は変更可能です。
とにかく、後のことが変わったので、同じDLLをマルチスレッドアプリケーション(DLLを変更せずに)で動作させたい。つまり、いくつかのスレッドがDLLから関数とグローバル変数にアクセスし、それらを変更します。これらはすべて、グローバル変数に一貫性のない値を保持させる可能性があります。
そこで質問が
たちはDLLのマルチアクセスを防止するために、クライアントコードで何かを行うことができ、同時に、が各スレッドはそれ自身のコンテキスト(つまり、で実行されることを確実にすること、ですDLLにアクセスすると、DLLのグローバル値は以前と同じになります)。
dllを少なくとも再構築することが許可されている場合は、すべてのグローバル定義に__declspec(threadlocal)を追加できます。コンストラクタやデストラクタを持つ静的スコープのクラスオブジェクトでは失敗すると強く思っています。 –
Chris ...いいえ、ソースコードの変更が許可されていないため、__declspec(threadlocal)をグローバルに追加できません。 :-) – Nawaz