std :: thread :: hardware_concurrency和静态初始化

时间:2016-06-06 06:38:18

标签: c++ multithreading c++11 static static-order-fiasco

这个全局函数可能会受到静态初始化惨败的影响吗?

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

1 个答案:

答案 0 :(得分:7)

  

这个全局函数可能会受到静态初始化惨败的影响吗?

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

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

  

$6.7: 4: 使用的动态初始化块范围变量   静态存储持续时间([basic.stc.static])或线程存储   持续时间([basic.stc.thread])是第一次执行控件   通过其声明;考虑这样的变量   初始化完成后初始化。如果   初始化通过抛出异常退出,初始化是   不完整,所以下次控制进入时会再次尝试   声明。 如果控件同时进入声明   在初始化变量时,并发执行   应等待完成初始化

另请参阅:Static local variables

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