我正在编写一些代码来执行到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的次数可能会超过需要的次数,但我不认为这会影响程序的正确性。
我的分析正确吗?

最佳答案

此代码在x86和amd64上是完全安全的。
最坏情况下,会多次调用GetProcAddress
在其他架构上,部分写入可能会被中断。为了避免这种情况,你可以使用原子(InterlockedComparExchange…),但这是多余的。

09-10 09:39
查看更多