C++11多线程实战:std::thread详解与示例
"详解C++ thread用法总结" C++11引入了`<thread>`库,使得在C++中编写多线程程序变得更加方便。`std::thread`类是核心的线程对象,它提供了创建、管理和同步线程的一系列功能。本文将深入探讨`std::thread`的主要用法。 1. **线程创建** 创建线程是通过`std::thread`类的构造函数完成的。你可以传递一个函数和函数参数来启动新的线程。例如,如果你有一个名为`do_something`的函数,你可以这样创建一个新的线程: ```cpp std::thread new_thread(do_something); ``` 如果`do_something`需要参数,你可以传递额外的参数: ```cpp void do_something(int param); std::thread new_thread(do_something, 42); // 参数42会被传递给do_something ``` 函数可以是成员函数,但需要传入一个对象实例的引用或指针: ```cpp class MyClass { public: void my_method(); }; MyClass obj; std::thread new_thread(&MyClass::my_method, &obj); ``` 2. **线程ID** 每个线程都有一个唯一的标识符,可以通过`get_id()`函数获取。线程ID是`std::thread::id`类型的,通常用于比较不同线程: ```cpp std::thread::id current_id = std::this_thread::get_id(); if (new_thread.get_id() != current_id) { // 这是另一个线程 } ``` 3. **线程状态** `joinable()`函数用来检查线程是否可以被`join`。如果线程已经结束,或者被`detach`,则返回`false`。新创建的线程默认是joinable的。 4. **线程同步** - **join()**: 当调用`join()`时,当前线程会阻塞,直到被join的线程执行完毕。这是释放线程资源的常用方法,因为joinable的线程在主线程结束时不会自动销毁。 ```cpp new_thread.join(); // 阻塞,等待new_thread执行完毕 ``` - **detach()**: `detach()`使得线程与其对象分离,线程将继续执行,而对象可以被销毁。被detach的线程将在完成执行后自动清理资源。 ```cpp new_thread.detach(); // 线程现在独立于new_thread对象,new_thread对象可以被销毁 ``` 5. **线程句柄** `native_handle()`函数返回与操作系统相关的线程句柄,允许你直接使用底层系统API来控制线程。这在某些特定需求下很有用,例如调整线程优先级或进行其他低级操作。 ```cpp auto native_hdl = new_thread.native_handle(); // 获取操作系统级别的线程句柄 ``` 6. **线程安全** 在C++11中,`std::mutex`和`std::lock_guard`等工具用于在多线程环境中保护共享资源。例如,如果多个线程需要访问一个共享变量,应使用`mutex`确保互斥访问: ```cpp std::mutex mtx; int shared_var = 0; void thread_func() { std::lock_guard<std::mutex> lock(mtx); ++shared_var; // 在锁的保护下修改变量 } ``` 7. **线程局部存储** 使用`std::thread_local`关键字,可以在每个线程中创建局部变量,即使在不同线程间也有不同的值: ```cpp std::thread_local int thread_counter = 0; ``` 8. **线程生命周期管理** 要注意的是,未被`join`或`detach`的线程会在其创建线程对象被销毁时被终止,可能导致未定义行为。因此,确保正确处理线程的生命周期至关重要。 通过理解并熟练运用这些概念和工具,你可以有效地在C++11及更高版本中编写多线程程序,充分利用现代计算机的多核优势。
![](https://csdnimg.cn/release/download_crawler_static/12722466/bg1.jpg)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 1
- 资源: 921
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Vue实现iOS原生Picker组件:详细解析与实现思路
- Arduino蓝牙小车:参数调试与功能控制
- 百度Java面试精华:200页精选资源涵盖核心知识点
- Swift使用CoreData填坑指南:CoreData在Swift 3.0的变化
- 微距离无线充电器创新设计及其实验探索
- MTK Android平台开发全攻略:44步详解流程
- RecyclerView全面解析:替代ListView的新选择
- Android开发:自动适配中英文键盘解决方案
- Android调用WebService接口教程
- Android开发:BitmapUtil图片处理全解析与实例
- Android多线程断点续传实现详解
- PCA算法在人脸识别会议签到系统中的应用
- EventBus 3.0:Android事件总线详解与实战应用
- Android FileUtil:全面解析文件操作实用技巧与实例
- RecyclerView添加头部和尾部实战教程
- Android实现微博滑动固定顶部栏实战与优化
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)