Основная проблема заключается в ограничении Windows того, что вы можете и что не можете делать в DllMain. В частности, вы не должны создавать потоки в DllMain. Статическая инициализация часто происходит из DllMain. Из этого логически следует, что вы не можете создавать потоки во время статической инициализации.
As far as I can tell from reading the C++0x/1x draft, starting a thread prior to main()
is fine, but still subject to the normal pitfalls of static initialization. A conforming implementation will have to make sure the code to intialize threading executes before any static or thread constructors do.
То, о чем вы говорите, касается не только языка, но и библиотеки времени выполнения C (CRT).
Для начала, если вы создаете поток, используя собственный вызов, такой как CreateThread ()
в Windows, то вы можете делать это где угодно, потому что он идет прямо в ОС без вмешательства CRT.
Другой вариант, который у вас обычно есть, - использовать _beginthread ()
, который является частью CRT. У использования _beginthread ()
есть некоторые преимущества, например, наличие потокобезопасной ошибки. Подробнее об этом здесь . Если вы собираетесь создавать потоки с помощью _beginthread ()
, могут возникнуть некоторые проблемы, поскольку инициализации, необходимые для _beginthread ()
, могут быть не на месте.
Это касается более общий вопрос о том, что именно происходит перед main ()
и в каком порядке. По сути, у вас есть функция точки входа в программу, которая заботится обо всем, что должно произойти до main ()
с Visual Studio, вы действительно можете посмотреть на этот фрагмент кода, который находится в CRT, и выяснить для себя, что точно происходит там. Самый простой способ добраться до этого кода - остановить точку останова в коде и просмотреть кадры стека перед main ()