c ++异步有时导致std :: system_error,有时不会

时间:2017-10-08 18:32:14

标签: multithreading c++11 cmake pthreads system-error

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

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文件夹中编译,具有相同的编译标志。可执行文件链接到它。

发生了什么事?

0 个答案:

没有答案