父线程join():块直到孩子完成?

时间:2014-12-11 20:35:47

标签: c++ multithreading boost-thread

我有一个C ++类可以执行一些多线程。考虑下面的伪代码:

void MyClass::Open() {
  loop_flag =  true;
  // create consumer_thread (infinite loop)
  // create producer_thread (infinite loop)
}
void MyClass::Close() {
  loop_flag = false;
  // join producer_thread
  // join consumer_thread
}
MyClass::~MyClass() {
  Close();
  // do other stuff here
}

请注意,consumer_thread,producer_thread及其相关函数都封装在MyClass中。调用者不知道他们的调用是多线程的,后台发生了什么。

现在,该课程是更大课程的一部分。该程序有一些初始的多线程来处理系统的配置,因为有很多东西同时发生。

像这样(伪代码):

int main() {
  // create config_thread1 (unrelated to MyClass)
  // create thread for MyClass::Open()
  // ...
  // join all spawned configuration threads
}

所以我的问题是,当我为链接到MyClass :: Open()的线程调用join()时(即main()中生成的配置线程),会发生什么?它是否立即join()(因为MyClass :: Open()函数在创建producer_thread和consumer_thread之后才返回)或者它等待producer_thread和consumer_thread完成(因此挂起我的程序)。

提前感谢您的帮助。在实现细节方面,我在Linux机器上使用Boost线程。

编辑添加此图表:

 main()
 |
 |
 |
 |--->configuration_thread (that runs MyClass::Open())
   |
   |
   |----> producer_thread
   |----> consumer_thread

如果我在configuration_thread()上调用join(),它是否会等到producer_thread()和consumer_thread()完成或者是否立即返回(并且producer_thread()和consumer_thread()继续运行)?

1 个答案:

答案 0 :(得分:1)

(非分离的)线程即使在从已设置为运行的函数返回之后也将是可加入的,直到它已加入。 例如:

#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

void foo(){
    std::cout << "helper: I'm done\n";
}

 int main(){

    cout << "starting helper...\n";
    thread helper(foo);

    this::thread::sleep_for(std::chrono::seconds(5));

     cout << "helper still joignable?..." << (helper.joignable()?"yes!":"no...:(") << "\n";

    helper.join();
    cout << "helper joined!";

    cout << "helper still joignable?..." << (helper.joignable()?"really?":"not anymore!") << "\n";

    cout << "done!\n";

}

输出:

starting helper...
helper: I'm done
still joinable?...yes!
helper joined!
still joinable?...not anymore!
done!

至于join方法需要多长时间,我不认为这是指定的,但肯定不必等待所有其他线程完成,否则就意味着只有一个线程才能加入所有其他线程。

来自§30.3.5:

  

void Join();

     

要求: joinable()true

     

效果:阻止,直到*this代表的线程完成。

     

同步: *this表示的线程的完成与相应的成功join()返回同步。 [注意: *this上的操作未同步。 * - 结束注释*]

     

[...]