C ++ 11分段错误,使用std :: promise
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
处发生段prom.set_value
。 如果我只创建1个线程,则不这样做。
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()));
}
创建所有线程和promise
以及future
对象。 不包括监控向量和删除死线的主循环等。
或许承诺和期货必须同步?
我在Lubuntu 14.04上使用gcc 4.9
promises.emplace_back();
可能导致所有包含的对象位置(引用,迭代器)的矢量重新分配和失效。 你有悬挂的参考。
将承诺转移到将存储将发送给数据使用者的未来之后的满足承诺的代码中。
请注意,MSVC在2013年锁定了一些承诺的线程移动。
你不能分享承诺。 改为移动它们:
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));
链接地址: http://www.djcxy.com/p/30749.html