DLLへの明示的なリンクを実行するためのコードを記述しています。このコードは、.libファイルとの暗黙的なリンクの代用としてユーザーに提供されます。現時点では私の計画のコードは次のようになります。このコードに同期を追加する必要はありますか?
void DisableModule(int Module)
{
typedef void (*DisableModuleProc)(int);
static DisableModuleProc proc = NULL;
if (proc == NULL)
proc = (DisableModuleProc)GetProcAddress(hModule, "DisableModule");
proc(Module);
}
は、このフォームの機能がたくさんありますが、私はこの質問の目的のためにエラーチェックを切除しています。
私の問題は、スレッドの安全性に関係しています。この関数は、複数のスレッドから同時に呼び出される可能性があります。明らかに、静的変数_DisableModule
にはレースがあります。私の信念は、_DisableModule
が機械語の境界(ターゲットに応じて32または64ビット境界のいずれか)に整列するため、引き裂きが発生しないこと、そしてレースが良性であることです。 GetProcAddress
が必要以上に多く呼び出される可能性はありますが、それがプログラムの正確性に影響するとは思いません。
私の分析は正しいですか?
呼び出される関数(_DisableModule)自体がスレッドセーフですか?また、アンダースコアと大文字で始まる識別子は予約されています。 – zvrba
@zvrbaはい、インポートされた関数はスレッドセーフです。予約済み識別子に関するアドバイスをありがとうございました。私はCに堪能ではない。 –
プロセッサの種類によって異なりますが、x86またはx64の場合はうまく動作します。 ARMについてはあまり確かではありませんが、弱いメモリモデルを持っています。スレッドを使用しているときは、常に「申し訳ありません」よりも安全です。 –