G++ -cilkplus 随机行为 std::vectors

G++ -cilkplus random behavior with std::vectors

GCC 系列处理以下(简化的)代码非常糟糕

#include <vector>
#include <cilk/cilk.h>

void walk(std::vector<int> v, int bnd, unsigned size) {
  if (v.size() < size)
    for (int i=0; i<bnd; i++) {
      std::vector<int> vnew(v);
      vnew.push_back(i);
      cilk_spawn walk(vnew, bnd, size);
    }
}

int main(int argc, char **argv) {
  std::vector<int> v{};
  walk(v , 5, 5);
}

具体来说:

我的问题:该代码是否有问题。我是在调用一些 未定义的行为还是我应该报告的错误?

回答我自己的问题:

根据 https://gcc.gnu.org/ml/gcc-help/2017-03/msg00078.html,它确实是 GCC 中的一个错误。在 cilk_spawn 中,临时对象在父对象中被销毁,而不是在子对象中被销毁。所以如果真的发生thread fork,可能销毁的太早了。