std::thread回收
时间: 2023-10-15 20:31:25 浏览: 213
c++11中关于std::thread的join的详解
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 ]
阅读全文