2014-10-04 2 views
1

Я пишу программу, которая использует статические методы и свойства, чтобы получить некоторые вещи, идущие до main. Язык является C++ 11Когда переменные нитей pthread начинаются во время статической инициализации?

Вопрос, когда я гарантирую, что локальные переменные потока (с pthread) будут существовать? То есть могу ли я безопасно настроить локальные переменные потока в статической инициализации основного потока до начала основного?

ответ

1

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

C++ Язык программирования, четвертое издание, Бьярне Страуструп:

12.1.8. Локальные переменные

Имя, определенное в функции, обычно называется локальным именем. Локальная переменная или константа инициализируется, когда поток выполнения достигает своего определения. Если не объявлено статическим, каждый вызов функции имеет свою собственную копию переменной. Если локальная переменная объявлена ​​статической, для представления этой переменной во всех вызовах функции будет использоваться один, статически назначенный объект (§6.4.2). . Это будет инициализироваться только в первый раз, когда поток выполнения достигает его определения. Например: ...

15.4.1. Инициализация нелокальных переменных ....

инициализации нелокальных (статически выделенных переменных) контролируется любым механизмом реализация использует для запуска программы C++. Этот механизм гарантированно работает правильно, только если выполнено main().

Хотя вы имеете в виду нить локальные переменные, так как код инициализации сам, по-видимому глобальный static, у вас нет никакой гарантии, что ваш код инициализации был выполнен до того main() начинает работать, так что если у вас есть статика в зависимости от другой статики, у вас могут быть проблемы.

Но как только выполняется main(), весь ваш код static был инициализирован. Если это так, будут доступны статические ресурсы, которые вы называете внутри main().

Если ваши потоковые локаторы объявлены в переменных потоков, которые являются статическими членами или глобальной статикой, main() должен выполняться так, чтобы статический поток инициализировался и в зависимости от того, как вы объявили свои локаторы потоков, также стартовал, нить локальная статика будет инициализирована к моменту достижения точки их выполнения.

+0

Переменные, о которых я беспокоюсь, являются локальными потоками. В какой момент они гарантированы, чтобы существовать? –

+0

Это часть 1 ответа: _It будет инициализирована только в первый раз, когда поток выполнения достигнет своего определения_.Поэтому, если ваши локаторы потоков объявлены в переменных потока, которые являются статическими членами или глобальной статистикой, 'main()' должен выполняться так, чтобы поток был запущен, и в этот момент локальная статика потока будет инициализирована к тому моменту, когда их точка выполнения будет достиг. – Vector

+0

@ThomasKejser - см. Править. Если вы указали локальную статику потока в статических членах или глобальных символах, то применимы обе части ответа. – Vector

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