0

0

C++怎么实现多线程 C++11多线程编程入门【教程】

穿越時空

穿越時空

发布时间:2026-03-04 10:51:11

|

526人浏览过

|

来源于php中文网

原创

std::thread 构造即启动但需显式 join 或 detach,否则析构时 terminate;共享数据用 mutex 或 atomic;等待用 condition_variable 而非轮询;async 适合一次性任务,future.get() 只能调用一次。

c++怎么实现多线程 c++11多线程编程入门【教程】

std::thread 怎么启动一个线程

直接构造 std::thread 对象就能跑起来,但必须注意:它不会自动 join 或 detach,不处理就 crash。常见错误是局部 std::thread 对象离开作用域时仍可 joinable,触发 std::terminate

  • 启动方式:std::thread t(func, arg1, arg2),支持函数指针、lambda、成员函数(需传入对象或指针)
  • 必须显式调用 t.join()(等待结束)或 t.detach()(分离执行),否则析构时报错
  • lambda 捕获要注意:默认按值捕获,若需修改外部变量,得用 [&];但引用捕获的对象生命周期必须长于线程
  • 成员函数要这样写:std::thread t(&MyClass::func, &obj, arg),第二个参数是对象地址

多个线程怎么安全共享数据

裸用全局变量或类成员变量必然出问题,std::mutex 是最基础的防护手段,但锁的粒度和顺序直接影响正确性和性能。

  • 保护临界区:用 std::lock_guard<:mutex></:mutex> 自动加锁/解锁,别手写 lock()/unlock()
  • 避免死锁:多个 mutex 要始终按相同顺序获取,比如统一按变量地址排序再 lock
  • std::atomic<int></int> 适合简单类型(如计数器),比 mutex 快,但不能用于复杂操作(比如“读-改-写”逻辑仍需锁)
  • 不要用 std::shared_ptr 管理多线程访问的资源——它的引用计数是原子的,但指向的对象内容不是

线程怎么等另一个线程结束或响应信号

std::thread::join() 是阻塞等待,但无法超时或响应中断;真正灵活的等待得靠 std::condition_variable + std::unique_lock

HaiSnap
HaiSnap

一站式AI应用开发和部署工具

下载
  • t.join() 是同步点,主线程卡住直到 t 完成;t.detach() 后无法再控制该线程
  • 条件变量必须配合 std::mutex 和一个共享状态变量(如 bool ready = false),wait() 会自动释放锁并挂起
  • 唤醒用 cv.notify_one()cv.notify_all(),注意 notify 可以在 wait 前发生,所以要用 while 循环检查条件,不能用 if
  • 别用 sleep_for 轮询代替 condition_variable——浪费 CPU,且有竞态

std::async 和 std::future 适合什么场景

它不是线程池,每次 std::async 默认可能新建线程(取决于 launch policy),适合“发个任务、稍后取结果”的一次性异步调用,不适合高频短任务。

立即学习C++免费学习笔记(深入)”;

  • 默认策略 std::launch::async | std::launch::deferred,具体行为由实现决定;想确保异步,显式写 std::launch::async
  • std::future::get() 会阻塞直到结果就绪,且只能调用一次;重复调用抛 std::future_error
  • 异常会被捕获进 future,get() 时重新抛出,这是跨线程传递错误的主要方式
  • 别把 std::async 当线程复用工具——没线程池,频繁调用开销大,还可能耗尽系统线程资源

线程生命周期管理、锁的范围、条件变量的虚假唤醒、future 的一次性语义——这些不是语法细节,是写对多线程的硬门槛。漏掉任何一个,程序都可能在压力下偶然崩掉,而不是立刻报错。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

87

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

104

2025.09.18

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

87

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

104

2025.09.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

930

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.08.29

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.6万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号