我有以下代码作为我的主要功能:
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文件中应该包含哪些内容,因为我已经对此进行了实验但无法使其工作。
答案 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。