如何在STL容器中正确初始化std :: once_flag

时间:2016-07-18 16:45:14

标签: c++ concurrency stl

我已经看到很多示例代码将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的预期值是什么。

提前感谢您的帮助。

0 个答案:

没有答案