提问者:小点点

C++11分段错误,带有std::promise


此代码创建多个线程并向它们发送一个。当它们调用试图将数据返回到main时,它会对faults进行分段。

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

void workerFunc(promise<long>& prom) {

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

线程函数。它在处分段故障。如果我只创建1个线程,则不执行此操作。

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

初始化。

    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()));
    }

创建所有线程以及对象。不包括的是主循环,在该循环中,向量被监控,死线程被移除,等等。

也许,承诺和未来必须同步吗?

我在Lubuntu 14.04上使用gcc 4.9


共2个答案

匿名用户

可能导致向量重新分配和所有包含的对象位置(引用,迭代器)的无效。你的推荐信太悬了。

在存储将发送给数据消费者的未来之后,将承诺移到将实现承诺的代码中。

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

匿名用户

你不能分享承诺。改为移动它们:

 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));

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++11|分段|带有|std|promise)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?