std :: vector中lambda的静态定义在多线程环境中崩溃

时间:2015-03-23 11:26:39

标签: multithreading c++11 vector lambda static

这是类中方法的代码片段:

....
std::string sHelper (sKey);

// interface keys definition with corresponding code implemented as lambda
std::vector<InterfaceOptionsResolve> vKeywords =
{
    {
        "{Instrument}",
        [&] (const std::string sKeyword)
        {
            // sInstrument is a member in the class
            sHelper.replace(sHelper.find(sKeyword), sKeyword.size(), sInstrument);
        }
    },
    ....
};

// check each interface template keyword against the provided interface template name
for ( const auto &itKeyword : vKeywords )
{
    if ( strstr(sHelper.c_str(), itKeyword.sParameter.c_str()) )
    {
        // if the interface key was found replace it with the corresponding value
        itKeyword.oLambda(itKeyword.sParameter);
    }
}
....

简而言之:在方法函数中,我定义了一个带有关键字的std::vector和一个为每个匹配关键字执行的lambda函数。我可以做几个if !strcmp(....) { the code from the lambda function },但我更喜欢这样。

当我将std::vector<InterfaceOptionsResolve> vKeywords =的定义更改为static std::vector....时,应用程序在多线程环境中崩溃(分段错误)。我不明白为什么。对我来说,只有lambda代码和const std::stringstatic,但是通过[&]访问方法变量应该从活动范围内完成。

有人可以解释一下我的逻辑错误吗?

这里是InterfaceOptionsResolve

的定义
typedef struct
{
    const std::string       sParameter;
    std::function<void(const std::string)>  oLambda;
} InterfaceOptionsResolve;

1 个答案:

答案 0 :(得分:2)

  

对我来说,只有lambda代码和const std::string是静态的,但是通过[&]访问方法变量应该从活动范围内完成。

不,lambda表达式在首次初始化静态向量时运行,因此[&]捕获将绑定对当前范围中sHelper的引用。当您下次运行该函数时,sHelper已消失,并且范围内有一个名为sHelper的完全不同的对象,但您的静态lambda仍然引用旧的。