在多线程应用程序中,有没有办法确保临界区只被初始化一次,除了将代码放在DLL main()中?
答案 0 :(得分:5)
在Windows Vista上,您可以使用一次性初始化功能。 Using One-Time Initialization显示了如何使用它们来确保只将事件初始化一次。
答案 1 :(得分:3)
我建议用一个类来包装CRITICAL_SECTION,该类将在其构造函数和析构函数中处理临界区对象的初始化和未初始化。这样,在大多数情况下,您将是线程安全的。 (您必须确保在构造函数完成之前没有人访问该对象,但这相对容易。)
您可以使用几种常见的CRITICAL_SECTION包装器。 MFC的CCriticalSection是显而易见的选择,但您也可以创建自己的选择。
答案 2 :(得分:1)
当然有很多方法。
等等。这与尝试在代码中创建单个实例的任何其他问题没有什么不同。
答案 3 :(得分:0)
您还可以使用包装类并声明该类的全局对象。全局对象的构造函数将仅在启动时调用一次。
答案 4 :(得分:0)
您可以DllMain
为DLL_PROCESS_ATTACH
初始化全局关键部分(并清理DLL_PROCESS_DETACH
)。