std::thread 线程详解
时间: 2023-05-14 14:07:07 浏览: 153
std::thread 是 C++11 中新增的线程库,它提供了一种方便的方式来创建和管理线程。使用 std::thread,你可以创建一个新的线程并指定它要执行的函数或方法。线程可以在后台运行,同时执行其他任务,从而提高程序的并发性和性能。std::thread 还提供了一些方法来控制线程的行为,如等待线程结束、获取线程 ID 等。如果你想了解更多关于 std::thread 的信息,可以查看 C++11 标准文档或相关的教程和示例。
相关问题
std::thread::join
std::thread::join是一个成员函数,用于等待线程的结束。在引用的代码中,d2.join()函数的作用是让主线程等待d2线程的执行完成,直到d2线程结束才能继续执行主线程的后续代码。具体来说,d2线程调用了join()函数,表示主线程要等待d2线程的任务完成才能继续执行。通过调用join()函数,可以避免主线程在d2线程还没有完成任务时退出,从而确保程序的正确执行。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [std::thread --join()](https://blog.csdn.net/shunlu5586/article/details/127783112)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [c++11中关于std::thread的join的详解](https://download.csdn.net/download/weixin_38690079/12750322)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [C++ std::thread join()函数调用](https://blog.csdn.net/baidu_28398971/article/details/126362262)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
std::thread回收
std::thread的回收操作可以通过调用join()或detach()来实现。在使用std::thread对象创建线程后,在合适的地方调用join()可以回收对应创建的线程的资源,避免资源泄漏。而调用detach()则是在创建线程后立即调用,将创建的线程与主线程解绑,允许它在后台运行。
为了确保主线程退出之前线程得到回收,可以使用try-catch捕获异常进行防护。在主线程中抛出异常时,可以在catch块中调用join()来等待线程退出。这样可以确保主线程退出前线程已经被回收。
以下是一个使用try-catch捕获异常进行防护的例子:
```
#include <iostream>
#include <thread>
using namespace std;
struct func {
func(int& i) : i(i) {}
void operator()() const {
cout << typeid(*this).name() << " " << __func__ << ": " << __LINE__ << " i: " << i << endl;
}
private:
int& i;
};
int main(int argc, char const *argv[]) {
int i = 1;
func f(i);
thread t(f);
try {
cout << "throw exception start: " << endl;
throw std::runtime_error("unknown error!!!!!!!!!!");
} catch(const std::exception& e) {
std::cerr << e.what() << '\n';
t.join();
}
return 0;
}
```
在上述例子中,当主线程抛出异常后,通过捕获异常并调用t.join()来等待线程退出。这样确保了线程的回收操作在主线程退出之前完成。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [c++11中关于std::thread的join的详解](https://download.csdn.net/download/weixin_38751537/13990981)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [std::thread使用注意资源回收问题](https://blog.csdn.net/xunye_dream/article/details/120602323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文