Потоки могут быть безопасно созданы во время статической инициализации?

От Zvon.org Ссылка XSLT :

XPath function: boolean contains (string, string) 

Hope это помогает.

8
задан Joseph Garvin 18 September 2009 в 18:20
поделиться

3 ответа

Основная проблема заключается в ограничении Windows того, что вы можете и что не можете делать в DllMain. В частности, вы не должны создавать потоки в DllMain. Статическая инициализация часто происходит из DllMain. Из этого логически следует, что вы не можете создавать потоки во время статической инициализации.

2
ответ дан 5 December 2019 в 20:17
поделиться

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.

0
ответ дан 5 December 2019 в 20:17
поделиться

То, о чем вы говорите, касается не только языка, но и библиотеки времени выполнения C (CRT).
Для начала, если вы создаете поток, используя собственный вызов, такой как CreateThread () в Windows, то вы можете делать это где угодно, потому что он идет прямо в ОС без вмешательства CRT.
Другой вариант, который у вас обычно есть, - использовать _beginthread () , который является частью CRT. У использования _beginthread () есть некоторые преимущества, например, наличие потокобезопасной ошибки. Подробнее об этом здесь . Если вы собираетесь создавать потоки с помощью _beginthread () , могут возникнуть некоторые проблемы, поскольку инициализации, необходимые для _beginthread () , могут быть не на месте.

Это касается более общий вопрос о том, что именно происходит перед main () и в каком порядке. По сути, у вас есть функция точки входа в программу, которая заботится обо всем, что должно произойти до main () с Visual Studio, вы действительно можете посмотреть на этот фрагмент кода, который находится в CRT, и выяснить для себя, что точно происходит там. Самый простой способ добраться до этого кода - остановить точку останова в коде и просмотреть кадры стека перед main ()

6
ответ дан 5 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: