C++ 如何使软件并行运行,c++;,directshow,opencv

C++ 如何使软件并行运行,c++;,directshow,opencv,c++,parallel-processing,C++,Parallel Processing,过去几个月我一直在开发facetracking系统,现在我需要让所有东西并行运行以提高性能 主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.initTracking

过去几个月我一直在开发facetracking系统,现在我需要让所有东西并行运行以提高性能

主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

请给我一些建议,从哪里开始搜索关于如何并行化的信息

我有一个双核处理器


谢谢

Printf不是线程安全的,也就是说它会像您遇到的那样混淆缓冲区。您可以以伪并行方式运行该进程(比如将每个调用切换到另一个处理步骤),或者以硬件并发方式运行它(std::thread、pthreads、boost::thread)


如果你有一个双核处理器,你当然可以利用多核处理,我建议使用boost。

只是为了澄清一下,通过使用线程,你可以获得真正的并行性。但请记住,您的计算机也在其内核中运行,其他后台进程占用CPU时间,因此您的功能并不总是被执行

<>为了在C++中获得一些并行性,你有很多选择。我列举三个:

。最古老最常见的方法是使用库,它几乎内置于每个编译器中

。新的C++标准,包括一些本地库来处理多线程,您可以检查它,但它仍然不支持每个编译器。大多数支持它的编译器只有部分功能。您还需要显式激活该标准。例如:

gcc -std=c++11
。最后,如果您想要一些“更高层次”的东西,您可以努力学习框架,它使用pragma指令来注释并行任务。然后,该框架将处理所有线程的创建,因此您可以将时间用于其他事情


注意:输出结果混合的原因不是因为线程以伪并行方式运行,而是因为它们在缓冲区上并发写入。因此,当缓冲区被转储时,您会看到线程写入缓冲区。如果有的话,这证明它们实际上是并行运行的,但是您让它们在同一个缓冲区中写入输出;)

那么你的意思是,我的系统使用线程就足够了,操作系统将负责并行性?我可以看到我的软件在执行过程中使用了7个线程。@Mattias,实际上,线程是操作系统为处理并行性而提供的抽象。当您创建结构时,它将在内部调度它们,就像它们是不同的进程一样,从而节省一些差异。例如,进程创建的所有线程都将共享PCB和堆。但要获得并行性,您只需使用编程语言提供的更高级别接口。