我正在尝试从那里获取代码示例:
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 文件夹中编译。并且可执行链接到它。
到底是怎么回事 ?