我正试图从那里获取代码示例:
https://solarianprogrammer.com/2012/10/17/cpp-11-async-tutorial/
int twice(int m){
return 2*m;
}
int main(){
std::vector< std::future<int> > futures;
for(int i=0;i<10;++i){
futures.push_back(std::async(twice,i));
}
for(auto &e:futures){
std::cout << e.get() << std::endl;
}
return 0;
}
此代码导致:
terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
我正在使用这些标志进行编译:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
下面的代码会导致相同的错误(我们只是实例化一些最小和未使用的对象):
int twice(int m){
return 2*m;
}
class Foo {
public:
Foo();
};
Foo::Foo(){}
int main(){
Foo foo;
std::vector< std::future<int> > futures;
for(int i=0;i<10;++i){
futures.push_back(std::async(twice,i));
}
for(auto &e:futures){
std::cout << e.get() << std::endl;
}
return 0;
}
这最终得到了类似的结果:
terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
但这样可以正常工作(即印刷品:0 2 4 ... 18符合预期):
int twice(int m){
return 2*m;
}
int main(){
nsp::Foo foo; // <---- difference here !
std::vector< std::future<int> > futures;
for(int i=0;i<10;++i){
futures.push_back(std::async(twice,i));
}
for(auto &e:futures){
std::cout << e.get() << std::endl;
}
return 0;
}
nsp :: Foo现在在另一个库中定义/声明(但具有相同的代码)。此库在相同的CMakeLists.txt文件夹中编译,具有相同的编译标志。可执行文件链接到它。
发生了什么事?