C++11 引入了对多线程的原生支持,这是一个重大的改进,使得众多开发者翘首以盼的并发编程成为 C++ 语言的一部分。
在 C++11 之前,开发者需要依赖于操作系统提供的 API 或第三方库来实现多线程。C++11 通过在标准库中添加了多线程支持,简化了多线程程序的编写,并提高了代码的可移植性和开发效率。
后续我会通过几篇文章介绍多线程支持的一些细节,当然也不是完全描述,毕竟要覆盖多线程的各个方面,足够写一本书了。
我目前写的这个系列,是想把 C++ 11/14/17/20/23 的新增特性挨个过一遍,让大家了解一下 C++ 的近些年的进展。
这个系列写完,大概得两三个月吧。之后针对在多个版本中持续迭代的特性,进行详细讲解。
再然后,介绍一些使用 C++ 新特性的开源项目。体验一下像写脚本语言一样写 C++ 的感觉。
闲话不多说,进入正题。以下是 C++11 在多线程方面增加的主要特性。
1. 线程管理
C++11 通过 <thread>
头文件引入了std::thread
类,使得创建和管理线程变得更加简单直接。
- 创建线程:可以直接通过
std::thread
的构造函数创建线程,并指定线程开始执行的函数。 - 线程等待:通过
join()
成员函数,可以等待线程完成执行。 - 线程分离:
detach()
允许线程在后台运行,这意味着主线程可以继续执行而不必等待该线程结束。
2. 互斥量
std::mutex
:用于管理对共享数据的互斥访问。std::mutex
提供了锁定和解锁操作,确保同一时间只有一个线程可以访问特定的数据。std::recursive_mutex
:允许同一线程多次获取锁。std::lock_guard
和std::unique_lock
:是互斥量的RAII(Resource Acquisition Is Initialization)封装,自动管理锁的生命周期,防止忘记释放锁。std::timed_mutex
和std::recursive_timed_mutex
:提供了带超时的锁定操作。
3. 条件变量
std::condition_variable
:用于线程间的同步,允许一个或多个线程等待某个条件成立。
4. promise 和 future
std::promise
和std::future
:允许从一个线程向另一个线程传递值(或异常)。std::promise
可以设置一个值或异常,而std::future
用于异步获取std::promise
设置的值或异常。std::async
:启动一个异步任务,返回一个std::future
对象,用于获取异步任务的结果。
5. 原子操作
std::atomic
:提供了原子类型封装,用于实现无锁编程。原子操作是不可分割的操作,保证了在多线程环境下的安全执行。
示例代码
以下是一个简单的示例,展示了如何使用std::thread
来创建一个新线程:
#include <iostream>
#include <thread>
void helloFunction() {
std::cout << "Hello from thread!" << std::endl;
}
int main() {
std::thread t(helloFunction); // 创建并启动线程
t.join(); // 等待线程结束
return 0;
}
这段代码创建了一个线程t
,在这个线程上执行helloFunction
函数。t.join()
确保主线程等待t
结束后再继续执行。
C++11 的多线程支持让编写并发和并行程序更加直接和安全。
有了这些特性,C++ 开发者解决复杂的并发问题时,不用在手动封装系统 API,在提高了程序性能的同时,也提高了开发效率。