0

我正在尝试从那里获取代码示例:

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 文件夹中编译。并且可执行链接到它。

到底是怎么回事 ?

4

0 回答 0