C++ C++;等待多个线程

C++ C++;等待多个线程,c++,multithreading,c++11,C++,Multithreading,C++11,我似乎找不到一个确切的答案来回答我的问题。我目前有一个程序,使用OpenNI2轮询Kinect V2传感器以获取新的帧数据。问题是我需要轮询每种类型的传感器;深度、红外和RGB分别显示,以便同时获得它们。这里是我的线程问题的切入点,我想在各自的线程中轮询三个传感器中的每一个,当所有函数调用都返回时,继续进行数据处理 我知道如何将每个新线程连接到主线程,以确保所有线程在程序退出之前完成,但是如何在程序中间等待一组特定线程完成?c++11中std::thread是否有我忽略的功能或特性,或者这是需要

我似乎找不到一个确切的答案来回答我的问题。我目前有一个程序,使用OpenNI2轮询Kinect V2传感器以获取新的帧数据。问题是我需要轮询每种类型的传感器;深度、红外和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);

您需要调用
.join
方法等待线程完成,然后销毁它们。调用
t.join()
时,会检查线程是否仍在执行某些操作,如果工作已完成,则会连接线程。如果线程不可连接(还有
t.joinable()
),主线程将等待次线程完成其工作,然后连接它

在您的情况下,您可以添加这些行

thread_RGB.join();
thread_IR.join();
thread_depth.join();
这是我在谷歌上找到的一张图片,展示了
thread::join()
的工作原理


调用所有线程的
join()
join
函数等待线程完成。一旦
join
函数返回,线程就真正完成了,它的“main”函数已经返回,可以安全地销毁
std::thread
对象。请参阅,例如,了解更多信息。啊,好吧,那么这是我对join()工作方式的误解。因此,如果我加入所有线程,则下一个代码块将在先前加入的线程完成之前不会执行?@Wired365:是的,正是如此。@Persixty谢谢,这是一个很好的建议。到目前为止,线程的创建和销毁并不是我在性能方面的瓶颈,它是所有图像处理的瓶颈,但我会记住这一点,以备将来使用线程。