这个全局函数可能会受到静态初始化惨败的影响吗?
template <typename TFn>
void ParallelFor(int iIni,int iFin,TFn Fn)
{
static const unsigned int NThread= std::thread::hardware_concurrency();
// ...
}
答案 0 :(得分:7)
不,它不会。你很安全......: - )这个全局函数可能会受到静态初始化惨败的影响吗?
引用C ++标准草案(强调我的)......
$6.7: 4: 使用的动态初始化块范围变量 静态存储持续时间([basic.stc.static])或线程存储 持续时间([basic.stc.thread])是第一次执行控件 通过其声明;考虑这样的变量 初始化完成后初始化。如果 初始化通过抛出异常退出,初始化是 不完整,所以下次控制进入时会再次尝试 声明。 如果控件同时进入声明 在初始化变量时,并发执行 应等待完成初始化
由于您的函数是函数模板template <typename TFn>
,因此对于每个单独的实例化(替换TFn
),将评估static const unsigned int NThread = std::thread::hardware_concurrency();