- 简介
在C++11中,我们可以通过std::thread
类来创建一个线程。该类提供了与操作系统级别的线程相关的方法,例如创建、销毁、挂起、恢复等。线程的执行中,有可能会出现多个线程共享同一个资源导致的竞争情况,此时,我们就需要对线程进行同步,在正确的时间点上对多个线程进行操作控制。join
函数就是一个非常常用的同步方法。
- 使用方法
join
函数用于等待线程的完成,并且将线程的执行控制权交给调用线程。join
函数有两种使用方法:
- 第一:使用
join
等待子线程完成后再执行后续任务
void do_something(int n) {
// do something
}
int main() {
std::thread t(do_something, 10);
// 插入其他处理逻辑
t.join();
return 0;
}
在上述示例中,调用线程创建一个参数为10的do_something
函数的子线程t
,然后线程t马上开始执行。如果t.join()函数没有被调用,那么调用线程将继续运行。但是,如果在调用线程中,我们希望等待子线程执行完毕后再执行后续处理逻辑,那么我们可以在调用线程中使用t.join()进行等待。
- 第二:使用
detach
函数后,需要使用join
函数等待线程时
void do_something_else() {
std::cout << "do something else" << std::endl;
}
int main() {
std::thread t(do_something_else);
t.detach();
// 插入其他处理逻辑
t.join(); // 此处会抛出std::system_error异常
return 0;
}
在上述示例中,创建了一个子线程t,然后在子线程中执行do_something_else
函数。由于该线程被使用了detach
函数进行分离操作,我们认为线程t已经“接手”了对资源的控制,调用线程不再需要去处理该子线程。而join
函数只有在创建线程没有使用detach
函数分离时,才能有效等待。因此,使用join
函数等待一个已经使用detach
函数进行分离操作的线程时,将会抛出std::system_error异常。
- 总结
join
函数的使用,可以保证在正确的时间点上对多个线程进行操作控制。在多线程编程中,使用join
非常常见,因此熟练掌握这个函数的使用方法,对我们编写高质量的多线程程序至关重要。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++11中关于std::thread的join的详解 - Python技术站