8

这个全局函数可能会遭受静态初始化失败吗?

template <typename TFn>
void ParallelFor(int iIni,int iFin,TFn Fn)    
{
  static const unsigned int NThread= std::thread::hardware_concurrency();
  // ...    
}
4

1 回答 1

7

这个全局函数可能会遭受静态初始化失败吗?

不,它不会。你很安全... :-)

引用 C++ 标准草案(强调我的)...

$6.7:4: 在控制第一次通过其声明时执行具有静态存储持续时间([basic.stc.static])或线程存储持续时间([basic.stc.thread])的块范围变量的动态初始化;这样的变量在其初始化完成时被认为已初始化。如果初始化抛出异常退出,说明初始化未完成,下次控件进入声明时会再次尝试。如果在变量初始化时控制同时进入声明,则并发执行将等待初始化完成

另请参阅:静态局部变量

由于您的函数是一个函数模板template <typename TFn>,因此对于每个单独的实例化(替换TFn),static const unsigned int NThread = std::thread::hardware_concurrency();都将被评估

于 2016-06-06T06:46:48.007 回答