C++等待多个线程

4
我似乎找不到一个准确的答案来回答我的线程问题。我目前有一个使用OpenNI2轮询Kinect V2传感器获取新帧数据的程序。问题是,我需要分别轮询每种类型的传感器; 深度,IR和RGB,以便同时获取它们。这就是我的线程问题所在。我想在它们各自的单独线程中轮询这三个传感器,并在所有函数调用返回后继续数据处理。
我知道如何将每个新线程链接到主线程,以确保所有线程在程序退出之前完成,但是如何在程序运行中等待特定一组线程完成呢?在C ++ 11的std :: thread中是否有我忽略的函数或功能,还是需要手动使用互斥锁或信号量来完成?
伪代码:
std::thread thread_RGB(Kinect::readFrame(Enum::RGB), kinect_1);
std::thread thread_IR(Kinect::readFrame(Enum::IR), kinect_1);
std::thread thread_depth(Kinect::readFrame(Enum::depth), kinect_1);

// Wait for all threads to finish getting new frame data
...

// Process data here
process_data(kinect_1.RGB_data);
process_data(kinect_1.IR_data);
process_data(kinect_1.depth_data);

1
依次为所有线程调用join() - Edgar Rokjān
3
join函数等待线程完成。一旦join函数返回,线程就真正地完成了,它的“主”函数已经返回,std::thread对象可以安全地析构。请参见例如std::thread参考资料获取更多信息。 - Some programmer dude
1
啊,好的,那么我之前对join()的理解有误。所以如果我加入所有线程,下一段代码就不会执行,直到之前加入的线程完成了? - Wired365
1
@Wired365:是的,完全正确。 - Martin Bonner supports Monica
1
@Persixty 谢谢,这是一个好建议。目前,线程的创建和销毁并不是我的性能瓶颈,而是所有图像处理的问题,但我会记住这个建议以备将来使用。 - Wired365
显示剩余5条评论
1个回答

3
您需要调用.join方法以等待线程完成并销毁它们。当您调用t.join()时,会检查线程是否仍在执行操作,如果工作已完成,则加入该线程。如果线程不可加入(也有t.joinable()),则主线程将等待到次要线程完成其工作,然后再加入它。
在您的情况下,您可以添加这些行。
thread_RGB.join();
thread_IR.join();
thread_depth.join();

这里是我在谷歌上找到的一张图片,展示了thread::join()的工作原理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接