使用多线程思考
- 若程序中存在耗时操作,且耗时操作数据不与其他发生交互,如下载数据,那么直接进行线程操作即可。
- 如果耗时操作需要进行数据交互,而且耗时操作能分成并行的两部分或多部分,那么也可以进行多线程进行加速(不能分成两部分并行,可以尝试改变业务逻辑是否能拆成并行).
人脸跟踪多线程使用
- 若跟踪逻辑为先检测人脸,再根据人脸检测结果进行模板匹配,那么是串行结构,无法并行。
- 若是将检测人脸和模板匹配结果进行分离,然后将模板匹配结果与人脸检测框进行IOU计算,那么就可以进行并行拆分。
人脸跟踪并行代码
std::thread thread1(tracking_corrfilter, frame,templ,ref(first_rect),2);
std::thread thread2(&UltraFace::detect, &face,frame,ref(face_list));
thread1.join();
thread2.join();
- 对于函数内部修改的变量要使用ref,否则会报错: error: no type named ‘type’ in ‘struct std::__invoke_resul
- 对于使用别的类的方法,要使用&符号,&UltraFace::detect是类以及方法名字, &face是类的实例变量。
- 对于使用当前文件中方法,第一个为方法名字如tracking_corrfilter,后续为方法的参数。