原谅我,因为我不是任何方式的多线程专家,需要一些帮助。所以在我提出问题之前,只需要一些知识:
预知识
伪代码 我正在尝试优化我的多线程代码,以便我可以获得应用程序的最大性能。目前这是我的代码的基本布局:
int HALT=0;
//Both func1 and func2 can be ran parallel for a short period of time
//but both must finish before moving to the next captured webcam frame
void func1(*STUFF){
//Processes some stuff
}
void func2(*STUFF){
//Processes similar stuff
}
void displayVideo(*STUFF){
while(PLAYBACK!=DONE){
*reads video from file and uses imshow to display the video*
*delay to match framerate*
}
HALT=1;
}
main{
//To open these I am using OpenCVs VideoCapture class
*OPEN VIDEO FILE*
*OPEN WEBCAM STREAM*
thread play(displayVideo, &STUFF);
play.detach();
while(HALT!=1){
*Grab frame from webcam*
//Process frame
thread A(func1,&STUFF);
thread B(func2,&STUFF);
A.join();
*Initialize some variables and do some other stuff*
B.join();
*Do some processing... more than what is between A.join and B.join*
*Possibly display webcam frame using imshow*
*Wait for user input to watch for terminating character*
}
//This while loop runs for about a minute or two so thread A and thread
//B are being constructed many times.
}
问题(S) 所以我想知道的是,如果有一种方法可以指定在构造新线程时我将使用哪个核心/线程。我担心当我一遍又一遍地创建线程A和B时,它们会跳到不同的线程并妨碍我的系统速度和/或视频的读取。尽管这种担心并不合理,但在运行代码时,我发现四核上存在非常奇怪的行为。通常情况下,我总会看到一个核心运行在40-60%左右,我认为它是主线程或播放线程。但至于其他核心,计算负荷非常大。在整个应用程序播放过程中,我看到两个内核从大约60%一直到100%,但这两个内核不会保持不变。它可以是第一,第二,第三或甚至第四核心,然后它们通常会大大下降到大约20-> 40%。偶尔我会看到只有1个核心下降到0%并保持这种方式,看起来是通过while循环的另一个循环(即抓取帧,进程,线程A,线程B,重复)。然后我会看到它们中的所有四个都再次激活,这是更期望的行为。
我希望我在这篇文章中并不是太模糊。我只是看到我得到了一些意想不到的行为,我想了解我可能做错了什么或不做什么。感谢任何人可以帮助或指出我正确的方向。