如何使函数同时运行多次?

时间:2017-03-24 12:39:57

标签: c++ multithreading opencv

我有以下代码作为我的主要功能:

int main(int argc,char** argv)
{
    CommandLineParser cmd(argc,argv,keys);
  if (cmd.has("help")) {
      cmd.about("");
      cmd.printMessage();
      return 0;
  }
  String alphaFile = cmd.get<String>("alpha");
  String betaFile = cmd.get<String>("beta");
  String gammaFile = cmd.get<String>("gamma");
  String deltaFile = cmd.get<String>("delta");
  int featureToUse = cmd.get<int>("feature");
  int classifier = cmd.get<int>("classifier");

  runOnSingleCamera(alphaFile, featureToUse, classifier);
  runOnSingleCamera(betaFile, featureToUse, classifier);
  runOnSingleCamera(gammaFile, featureToUse, classifier);
  runOnSingleCamera(deltaFile, featureToUse, classifier);

  return 0;
}

runOnSingleCamera是我的其他功能之一,每个调用在不同的视频文件上运行相同的东西。代码需要在所有视频文件上同时运行并访问同一个全局数组。

这样做的最佳方法是什么?

如果解决方案是多线程的,请告知我的cmake文件中应该包含哪些内容,因为我已经对此进行了实验但无法使其工作。

1 个答案:

答案 0 :(得分:2)

这个怎么样:

int main(int argc,char** argv)
{
    CommandLineParser cmd(argc,argv,keys);
  if (cmd.has("help")) {
      cmd.about("");
      cmd.printMessage();
      return 0;
  }
  String alphaFile = cmd.get<String>("alpha");
  String betaFile = cmd.get<String>("beta");
  String gammaFile = cmd.get<String>("gamma");
  String deltaFile = cmd.get<String>("delta");
  int featureToUse = cmd.get<int>("feature");
  int classifier = cmd.get<int>("classifier");

  std::thread t1(runOnSingleCamera, alphaFile, featureToUse, classifier);
  std::thread t2(runOnSingleCamera, betaFile, featureToUse, classifier);
  std::thread t3(runOnSingleCamera, gammaFile, featureToUse, classifier);
  std::thread t4(runOnSingleCamera, deltaFile, featureToUse, classifier);

  t1.join();
  t2.join();
  t3.join();
  t4.join();

  return 0;
}

多线程虽然不是玩具。如果这里的一切都是独立的,那么这是可以的。如果变量以某种方式相互依赖,则必须小心。

如果您的阵列是只读的,那么这没关系。如果您的阵列需要被所有线程修改,那么这是一个销毁配方。再次,真的要小心线程之间的共享变量。这是一个非常大的话题。阅读race-conditions

请注意,这一切都是通过价值传递的;即,所有内容都复制到您的函数中(即使您的函数通过引用获取内容)。您应该使用std::ref()通过引用传递。详细了解std::thread here