1.1、C++并发支持的历史演进
你有没有想过,为什么现在的程序都说“多线程”“并发”,而早期的C++却完全不支持?为什么C++11一出,整个并发世界突然变得简单又强大?本文将用最通俗的语言,帮你理清C++并发支持的历史脉络,讲透并发的核心概念,再用实战代码带你快速上手。
1. C++98时代:没有并发,靠“土法炼钢”
C++98标准发布时,语言根本没有考虑多线程。你想写多线程?抱歉,C++标准没这功能。那时候开发者只能依赖操作系统的专属API,比如Linux上的POSIX线程库(pthread),Windows上的Win32线程API。问题是,不同平台代码写法差异巨大,移植性差,写起来也很麻烦。
2. 平台扩展阶段:厂商各自为政
为了满足需求,编译器厂商和第三方库开始“自己动手”,比如微软的Visual C++支持Windows线程,GCC支持POSIX线程。虽然解决了问题,但代码还是平台依赖,且缺乏统一的内存模型,线程安全无法保证。
3. 类库封装阶段:Boost和ACE的出现
Boost.Thread等库出现了,它们封装了底层平台API,提供了面向对象的线程接口。这样写多线程代码更方便,也更统一了,为C++标准化并发支持铺平了道路。
4. C++11:并发支持的里程碑
C++11标准终于把并发纳入语言标准,带来了:
- •
std::thread
:标准线程类,跨平台 - • 内存模型:定义多线程环境下的内存访问规则,解决数据竞争
- • 同步机制:互斥锁(
std::mutex
)、条件变量(std::condition_variable
)、原子操作(std::atomic
) - • 异步机制:
future/promise
支持异步任务结果传递
这让并发编程变得标准化、可移植,也更安全。
5. 持续改进:C++14、C++17、C++20
- • C++14增加了读写锁(
std::shared_timed_mutex
) - • C++17引入并行算法,STL算法可以并行执行
- • C++20带来了协程、
jthread
等新特性,进一步简化异步和并发编程
并发到底是什么?
简单说,并发就是“多个任务同时进行”,但这里的“同时”不一定是真正同时执行,可能是快速切换让你感觉它们在一起跑。
- • 任务切换:单核CPU通过快速切换任务,模拟同时执行
- • 硬件并发:多核CPU真正同时执行多个任务
任务切换需要操作系统保存和恢复任务状态(上下文切换),这会带来一定开销。
多进程 vs 多线程
特点 | 多进程 | 多线程 |
内存空间 | 独立 | 共享同一进程地址空间 |
通信方式 | 信号、套接字、管道等 | 直接访问共享内存 |
优点 | 进程间隔离,安全性高 | 通信开销低,效率高 |
缺点 | 通信复杂,开销大 | 线程安全问题复杂,需要同步机制 |
Hello Concurrent World
#include <iostream>
#include <thread>
void hello() {
std::cout << "Hello Concurrent World\n";
}
int main() {
std::thread t(hello); // 创建线程,执行hello函数
t.join(); // 等待线程完成
return 0;
}
解析:
- •
<thread>
头文件包含线程相关声明 - •
std::thread
对象t
创建新线程,立即执行hello
- •
join()
让主线程等待t
执行完,防止程序提前结束
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1118
文章版权归作者所有,未经允许请勿转载。
THE END