如何让一个函数同时运行多次?

Posted

技术标签:

【中文标题】如何让一个函数同时运行多次?【英文标题】: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 文件中应该包含哪些内容,因为我已经对此进行了试验,但无法使其工作。

【问题讨论】:

查看std::threaden.cppreference.com/w/cpp/thread/thread/thread的示例 【参考方案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 中的对象。 另外我的数组确实需要被所有线程修改,并且是全局声明的,这是否意味着我需要使用锁和/或互斥锁? 我还要注意,如果这些函数正在访问同一个全局数组并且他们正在修改它,那么您需要在函数中构建同步。

以上是关于如何让一个函数同时运行多次?的主要内容,如果未能解决你的问题,请参考以下文章

一个PHP程序,同一时刻被请求多次,怎么让它只运行一次?

如何同时运行两个函数

你能快速运行函数多次吗?

在具有不同输入的 1x exe 中同时多次运行 python 脚本

如何使用 Pythons Multiprocessing 库的 Process 类多次运行一个函数?

Azure 函数 - 防止多次调用