我已经看到很多示例代码将once_flag声明为静态变量,并使用以下方法初始化once_flag。
once_flag();
构造一个once_flag对象。内部状态设置为表示尚未调用任何函数。
但是,在我当前的项目中,我需要动态分配once_flags的给定数量(aInSize)来控制并发初始化,如下所示:
ONCEFLAG_MAP = new std::vector<std::once_flag>(aInSize);
这种方法导致程序崩溃,因为访问未初始化的数据,分段错误。当我解码核心时,我可以清楚地看到我想要初始化的数据不存在,但奇怪的是ONCEFLAG_MAP中的相应条目仍然显示为0,我假设它表示仍未触及once_flag:
(gdb) p **(((*ONCEFLAG_MAP)._M_impl._M_start)@436)
$48 = {_M_once = 0}
代码逻辑如下:
* H:
static std::vector<std::once_flag>* ONCEFLAG_MAP;
inline init_func()
{
ONCEFLAG_MAP = new std::vector<std::once_flag>(aInSize);
}
* C:
std::vector<std::once_flag>* ONCEFLAG_MAP = NULL;
void PropRefs::addDataToMap()
{
Data* lData = new Data();
initData(lData);
DATA_COLLECTION[dataIndex] = lData;
}
Data* PropRefs::getData() const
{
std::call_once((*ONCEFLAG_MAP)[propRefTableIndex],
&addDataToMap, this);
return DATA_COLLECTION[dataIndex];
}
这是否意味着我没有正确初始化once_flag向量?另外,我想知道触发回调后once_flag的预期值是什么。
提前感谢您的帮助。