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】公众号,未经授权,不得转载。
    (加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
THE END