std::thread::hardware_concurrency и статическая инициализация
Может ли эта глобальная функция пострадать от статической инициализации фиаско?
template <typename TFn>
void ParallelFor(int iIni,int iFin,TFn Fn)
{
static const unsigned int NThread= std::thread::hardware_concurrency();
// ...
}
1 ответ
Может ли эта глобальная функция пострадать от статической инициализации фиаско?
Нет, не будет. Ты в безопасности...:-)
Цитирую черновик стандарта C++ (выделено мое)...
$ 6.7: 4: Динамическая инициализация переменной области блока со статической продолжительностью хранения ([basic.stc.static]) или продолжительностью хранения потока ([basic.stc.thread]) выполняется при первом прохождении контроля через его объявление; такая переменная считается инициализированной после завершения ее инициализации. Если инициализация завершается выдачей исключения, инициализация не завершена, поэтому она будет повторена при следующем входе элемента управления в объявление. Если во время инициализации переменной элемент управления вводит объявление одновременно, параллельное выполнение должно ожидать завершения инициализации
Также см.: Статические локальные переменные
Поскольку ваша функция является шаблоном функции template <typename TFn>
для каждого отдельного экземпляра (замена TFn
), static const unsigned int NThread = std::thread::hardware_concurrency();
будет оцениваться