我过去几个月一直在研究一个面部跟踪系统,现在我需要让所有东西并行运行以提高性能。
主要的cpp文件是:
int _tmain(int argc, _TCHAR* argv[])
{
cFrame.initCamFrames(20, 1600, 1200, 3); //INITIATES BUFFER FOR CAM FRAMES, 20 frames, res:1600x1200, 3bytes per pixel.
eyeTracking.initTrackingSystem(&cFrame); //INITIATES EYETRACKING SOFTWARE WITH POINTER TO THE BUFFER WHERE EYETRACKINGSOFTWARE GETS THE FRAMES TO SEARCH WITHIN. (opencv)
directShow directShowClass;
directShowClass.initiateDirectShow(false, &cFrame); //INITIATES DIRECTSHOW WITH POINTER TO BUFFER WHERE IT SHOULD SAVE FRAMES FROM CAM
directShowClass.runDirectShow(); //START CAPTURING FRAMES INTO BUFFER
eyeTracking.runTrackingSystem(); //START SEARCH FOR FACE AND EYES.
system("pause");
directShowClass.stopDirectShow();
}
我想要“directShowClass.runDirectShow();”和“eyeTracking.runTrackingSystem();”以真正的平行方式运行。现在我认为它们在伪并行中作为线程运行。 (每种方法中的简单printf在终端中混合出来)。
我想让一个程序并行运行并不像我希望的那样简单。但我猜这有可能:D
请给我一些建议,从哪里开始搜索有关如何进行paralellisize的信息。
我有双核处理器。
谢谢!
答案 0 :(得分:0)
Printf不是线程安全的,也就是说它可以像你遇到的那样混淆缓冲区。您可以以伪并行方式运行该进程(例如将每个调用切换到另一个处理步骤)或以硬件并发方式运行(std :: thread,pthreads,windows thread,boost :: thread)。
如果您有双核处理器,您肯定可以利用多核处理,我建议使用boost。
答案 1 :(得分:0)
要清除,通过使用线程,您可以获得真正的并行性。但请记住,您的计算机也在其核心中运行,其他进程在后台占用CPU时间,因此您的功能并不总是被执行。
为了在C ++中获得一些并行性,你有很多选择。我说三个:
。最古老的最常用方法是使用pthread库,它几乎内置于每个编译器中。
。新的C ++标准,称为C++11,包括一些处理多线程的本机库,你可以检查出来,但每个编译器仍然不支持它。大多数支持它的编译器只有部分功能。您还需要明确激活标准。例如:
gcc -std=c++11
。最后,如果您想要一些“更高级别”的东西,您可以花一些精力学习OpenMP框架,它使用pragma指令来注释并行任务。然后框架将处理所有线程的创建,因此您可以将时间用在其他一些东西上。
P.S:输出混合的原因不是因为线程以伪并行方式运行,而是因为它们在缓冲区上同时写入。因此,当缓冲区被转储时,您会在线程写入它时看到它。如果有的话,这证明它们实际上是并行运行的,但是你要让它们在同一个缓冲区中写出它们的输出;)