C ++ 11使用std :: promise进行分段错误

时间:2015-07-18 11:51:02

标签: c++ multithreading c++11

C ++ std :: promise分段错误

此代码创建多个线程并向其发送promise&。当他们调用promise::set_value尝试将数据返回main时会出现段错误。

有人可以解释为什么这段代码会产生分段错误吗?

void workerFunc(promise<long>& prom) {

    long number = doInterestingThings();
    //SEGFAULT!!!
    prom.set_value(number);
    return;
}

线程功能。它在prom.set_value处发生了段错误。如果我只创建一个帖子,就不会这样做。

int main (int argc, char** argv) {
    vector<promise<long>> promises;
    vector<future<long>> futures;
    vector<thread> workers;

Intialization。

    const int createThisMany = 6;
    for (int i = 0; i < createThisMany; i++) {
        promises.emplace_back();
        futures.push_back(promises.back().get_future());
        workers.emplace_back(workerFunc, std::ref(promises.back()));
    }

创建所有线程以及promisefuture个对象。不包括主循环,其中监视向量并移除死线等等。

承诺和未来是否必须同步?

我在Lubuntu 14.04上使用gcc 4.9

2 个答案:

答案 0 :(得分:4)

你无法分享承诺。 移动代替:

 workers.emplace_back(workerFunc, std::move(promises.back());

void workerFunc(promise<long> prom);

这意味着您可能不需要空承诺的矢量:

promise<long> pr;
futures.push_back(pr.get_future());
workers.emplace_back(workerFunc, std::move(pr));

答案 1 :(得分:1)

promises.emplace_back();会导致向量重新分配并使所有包含的对象位置(引用,迭代器)失效。你有悬挂的参考资料。

在保存将发送给数据使用者的未来之后,将承诺移动到将完成承诺的代码中。

请注意,MSVC在2013年搞砸了承诺的一些线程移动。