2009-12-09 4 views
2

Скажем, у меня есть DLL, которая имеет следующее статический/глобальный:LoadLibrary Статические/Глобал и Нити

ClassA Object; 

Наряду с реализацией ClassA, он также содержит «нормальную» ClassB, который не будет работать должным образом если ClassA еще не сконструирован (именно поэтому я сделал ClassA статическим/глобальным).

В Windows я считаю, что загрузчик DLL загрузит эту DLL при вызове конструктора ClassB, правильно? На этом этапе ClassA будет построен, а затем будет построена ClassB. Если второй поток приходит и строит ClassB, ClassA не будет построен так, как он уже был построен.

Теперь, мой вопрос: что, если ClassB создается одновременно двумя потоками. Итак, Thread 1 начнет строить ClassA. Будет ли Thread 2 ждать, пока ClassA не будет полностью сконструирован до выполнения конструктора ClassB?

Иными словами, использует ли LoadLibrary() CriticalSection для обеспечения потоковой инициализации статических/глобальных переменных DLL? Моя догадка - «да», но я не могу найти какую-либо документацию, говорящую так или иначе.

ответ

1

DllMain вызывается загрузчиком Windows, удерживая внутренний критический раздел, известный как «блокировка загрузчика», поэтому ваши статические конструкторы будут вызываться во время события DLL_PROCESS_ATTACH, которое возникает только один раз, когда ваша DLL загружается впервые.

+0

Спасибо - это согласуется с тем, что я интерпретировал документальной документацией DllMain, но я с облегчением нашел кого-то другого в согласии с моей интерпретацией. –

1

Посмотрите на документацию для DllMain; Я считаю, что он говорит о блокировке загрузчика и порядке инициализации.

0

DLL не инициализируется, как EXE, поскольку они разделяются несколькими процессами. То, что вам нужно, - это объект singleton, который является одноразовой фабрикой для ваших других объектов.

Заметьте, я предполагаю, что здесь «ClassA» и «ClassB» вы имеете в виду экземпляры этих классов ...

Например, вы могли бы коснуться как

ClassA& GetTheClassAInstance(); 
ClassB& GetTheClassBInstsance(); 

Первый раз они называются, эти функции гарантируют, что ваши глобальные экземпляры ClassA и ClassB будут правильно построены.

 Смежные вопросы

  • Нет связанных вопросов^_^