【问题标题】:Initialize Critical Section only once for a process一个进程只初始化一次临界区
【发布时间】:2010-10-17 23:54:24
【问题描述】:

在多线程应用程序中,除了将代码放入 DLL main() 之外,有没有办法确保关键部分只初始化一次??

【问题讨论】:

    标签: windows winapi com dll


    【解决方案1】:

    在 Windows Vista 上,您可以使用一次性初始化功能。 Using One-Time Initialization 展示了如何使用它们来确保事件只被初始化一次。

    【讨论】:

    • 这绝对是个好办法;如果在保证调用所有全局对象构造函数之前需要使用临界区,则依赖全局变量或单例将无法正常工作。
    【解决方案2】:

    我建议将 CRITICAL_SECTION 包装在一个类中,该类将在其构造函数和析构函数中处理临界区对象的初始化和取消初始化。这样,在大多数情况下,您将是线程安全的。 (您必须确保在其构造函数完成之前没有人访问该对象,但这相对容易。)

    您可以使用几个常见的 CRITICAL_SECTION 包装器。 MFC 的CCriticalSection 是显而易见的选择,但您也可以创建自己的。

    【讨论】:

      【解决方案3】:

      当然有很多很多方法。

      1. 使用全局变量
      2. 使用单例实例
      3. 在 main 或其他单实例函数中创建它
      4. 将其创建为某个单一实例类实例的成员 var

      等等。这与尝试在代码中创建某个事物的单个实例的任何其他问题没有什么不同。

      【讨论】:

        【解决方案4】:

        您还可以使用包装类并声明该类的全局对象。全局对象的构造函数只会在启动时调用一次。

        【讨论】:

          【解决方案5】:

          您可以在DllMain 中为DLL_PROCESS_ATTACH 初始化一个全局临界区(并为DLL_PROCESS_DETACH 清理)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-12-06
            • 2015-08-23
            • 2017-11-15
            • 2019-07-15
            • 2016-04-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多