【问题标题】:How do I make a function run multiple times simultaneously?如何让一个函数同时运行多次?
【发布时间】:2017-03-24 12:39:57
【问题描述】:

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

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 文件中应该包含哪些内容,因为我已经对此进行了试验,但无法使其工作。

【问题讨论】:

标签: c++ multithreading opencv


【解决方案1】:

这个怎么样:

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 的更多信息。

【讨论】:

  • 当我说我无法让多线程工作时,这就是我所指的,对缺乏清晰表示歉意,我收到以下错误:
  • /usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: undefined reference to symbol 'pthread_create@@GLIBC_2.2.5' //lib/x86_64-linux-gnu/libpthread .so.0:添加符号时出错:命令行collect2中缺少DSO:错误:ld返回1退出状态CMakeFiles/main.dir/build.make:163:目标'main'的配方失败make [2]:*** [main] 错误 1 ​​CMakeFiles/Makefile2:67: 目标“CMakeFiles/main.dir/all”的配方失败 make[1]: *** [CMakeFiles/main.dir/all] 错误 2 Makefile:83: 目标配方'all' 失败 make: *** [all] 错误 2
  • @TomRobson 您必须链接到 pthread。使用标志-pthread 链接。您可以在 cmake 中使用 target_link_libraries 来实现此目的。例如target_link_libraries(MyExec -pthread)。将 MyExec 替换为 cmake 中的对象。
  • 另外我的数组确实需要被所有线程修改,并且是全局声明的,这是否意味着我需要使用锁和/或互斥锁?
  • 我还要注意,如果这些函数正在访问同一个全局数组并且他们正在修改它,那么您需要在函数中构建同步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2022-01-24
  • 2015-12-14
相关资源
最近更新 更多