views:

1015

answers:

5

In a multi threaded application, is there a way to ensure that a Critical Section is initialized only once except for putting the code in DLL main() ??

+1  A: 

Sure there are many many ways.

  1. Use a global variable
  2. Use a singleton instance
  3. Create it in main or some other single instance function
  4. Create it as a member var of some single instance class instance

and so on. This is no different from any other question of trying to create a single instance of some thing in your code.

1800 INFORMATION
A: 

You can also use a wrapper class and declare a global object of that class. The constructor of the global object will be invoked only once at the startup.

sharptooth
+2  A: 

I'd suggest wrapping the CRITICAL_SECTION with a class that will handle the initialization and uninitialization of the critical section object in its constructor and destructor. This way, you'll be thread safe in most cases (you'll have to make sure noone accesses the object before its constructor completes, but that's relatively easy).

There are several common wrappers for CRITICAL_SECTION you can use. MFC's CCriticalSection is the obvious choise, but you can create your own as well.

eran
+5  A: 

On Windows Vista you can use the one-time initialization functions. Using One-Time Initialization shows how to use them to make sure an event is initialized only once.

freak
This is definitely a good approach; relying on global variables or singletons doesn't work well if the critical section needs to be used before all global object constructors are guaranteed to be called.
Reuben
A: 

You can initialize a global critical section in DllMain for DLL_PROCESS_ATTACH (and clean up for DLL_PROCESS_DETACH).

Richard