如何让一个函数同时运行多次?
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::thread
en.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 中的对象。
另外我的数组确实需要被所有线程修改,并且是全局声明的,这是否意味着我需要使用锁和/或互斥锁?
我还要注意,如果这些函数正在访问同一个全局数组并且他们正在修改它,那么您需要在函数中构建同步。以上是关于如何让一个函数同时运行多次?的主要内容,如果未能解决你的问题,请参考以下文章
在具有不同输入的 1x exe 中同时多次运行 python 脚本