我有一个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()继续运行)?
答案 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
上的操作未同步。 * - 结束注释*][...]