Особенности запуска потоков Dll в Windows

Jun 24, 2011 12:11

Наступила на интересные грабли. Уже думала, у меня крыша едет. Оказалось, не у меня, а у венды :)
Предыстория задачи: была у меня консольная утилька, стало нужно переделать её в dll. Я решила просто перенести содержимое инициализации из main в DLL_PROCESS_ATTACH функции DllMain. В инициализации порождался дочерний поток, ожидался ответ от него и на этом инициализация, собственно, завершалась.
И вот после переноса инициализации в DLL_PROCESS_ATTACH программа перестала работать. Причём очень странно: она не получала ответа от дочернего потока. Я перековыряла всё, перепроверила весь поток (а там у меня довольно навороченный поток был, с кучей всяческих темплейтов и библиотек буста). Перерыла всё, пока не поняла, что поток всё же запускается.... НО! Он запускаеся ПОСЛЕ выхода из обработки DLL_PROCESS_ATTACH. Вот так вот жосско.
Выход, естественно, был сделан через дополнительную функцию инициализации в библиотеке, которая вызывалась уже после загрузки библиотеки через GetProcAddress. Так всё прекрасно работает.
Что интересно, такая же схема в линюксе (когда поток порождается в инициализации __attribute__ ((constructor)) функции библиотеки) прекрасно работает.
Вот такие грабельки. Век живи - век учись :)

P.S. Может, оно, конечно, так и должно быть. Но чисто теоретически, если я хочу провести инициализацию потоков один раз на процесс, то для этого нужно принудить юзера дополнительно вызывать специальную функцию.

грабли, программирование, dll, глюки, венда, работа

Previous post Next post
Up