此代码创建多个线程并向它们发送一个
有人能解释为什么这段代码会产生分段错误吗?
void workerFunc(promise<long>& prom) {
long number = doInterestingThings();
//SEGFAULT!!!
prom.set_value(number);
return;
}
线程函数。它在
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
在存储将发送给数据消费者的未来之后,将承诺移到将实现承诺的代码中。
请注意,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));