本书专注于讲解C++11中的并发编程技术,重点介绍如何利用`std::thread`进行多线程开发。适合希望提升程序性能和响应性的C++程序员阅读。
C++11并发编程:多线程std::thread
C++11引入了`thread`类,大大降低了使用多线程的复杂性。在此之前,实现跨平台的多线程程序需要依赖于系统API,并且代码移植时常常面临修改的问题。而在C++11中,通过语言层面提供的`std::thread`可以解决这些难题。
一、概述
在C++11中引入了`std::thread`类,为开发人员提供了便捷的多线程编程工具。该类包含多种构造函数、成员函数和静态方法以适应不同的应用场景需求。
二、构造函数
1. 默认构造函数
```cpp
thread() noexcept;
```
创建一个空的`std::thread`对象。
2. 初始化构造函数
```cpp
template explicit thread(Fn&& fn, Args&&... args);
```
创建并初始化一个新的线程,该线程将执行由给定参数指定的功能。
3. 拷贝构造函数(被禁用)
```cpp
thread(const thread&) = delete;
```
4. 移动构造函数
```cpp
thread(thread&& x) noexcept;
```
调用成功后原来的`x`就不再是有效的线程对象了。
三、成员方法
1. `get_id()`
返回当前线程的唯一标识符,类型为`std::thread::id`。
2. `join()`
等待指定的线程执行完毕。如果该函数被调用,则会阻塞直到目标线程完成运行为止。
3. `detach()`
使一个已连接到当前对象的线程成为独立的守护进程,并且不再由这个特定的对象控制它。
4. `swap()`
交换两个`std::thread`实例的内容。
5. `hardware_concurrency()`
返回逻辑处理器的数量,通常用于指导多线程程序中的并发程度。
四、示例使用
1. 创建并启动一个新线程
```cpp
void threadFun1(){
cout << this is thread fun1 ! << endl;
}
int main(){
std::thread t1(threadFun1);
t1.join();
getchar();
return 0;
}
```
2. 向线程传递参数并启动它
```cpp
void threadFun2(int v){
cout << this is thread fun2 ! << endl;
cout << v << endl;
}
int main(){
std::thread t1(threadFun2, 5);
t1.join();
getchar();
}
```
通过使用`std::thread`类,可以更轻松地实现多线程编程,并解决跨平台的问题。这不仅提高了代码的可移植性也增强了其维护能力。