【问题标题】:C++ Waiting for Multiple ThreadsC++ 等待多线程
【发布时间】:2017-06-26 12:44:39
【问题描述】:

我似乎找不到线程问题的确切答案。我目前有一个使用 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);

【问题讨论】:

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

标签: c++ multithreading c++11


【解决方案1】:

您需要调用.join 方法等待线程完成然后销毁它们。当您调用t.join() 时,会检查线程是否仍在做某事,如果工作完成,则线程是否已加入。如果线程不可加入(也有t.joinable()),主线程将等到辅助线程完成工作后再加入。

根据您的情况,您可以添加这些行。

thread_RGB.join();
thread_IR.join();
thread_depth.join();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多