0

0

C++如何使用std::thread创建和管理线程_C++ std::thread使用方法

穿越時空

穿越時空

发布时间:2025-10-05 09:47:02

|

540人浏览过

|

来源于php中文网

原创

C++11引入std::thread,通过#include 使用,支持函数、lambda创建线程,参数传递需用std::ref包装引用,线程必须join或detach,可结合vector管理多线程。

c++如何使用std::thread创建和管理线程_c++ std::thread使用方法

在C++11中,std::thread被引入标准库,使得多线程编程变得更加简单和安全。通过#include 即可使用,无需依赖平台特定的API(如pthread)。下面介绍如何用std::thread创建和管理线程。

创建线程

使用std::thread构造函数启动一个新线程,传入一个可调用对象(函数、lambda、函数对象等)作为线程执行体。

示例:使用普通函数启动线程

#include 
#include 

void say_hello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(say_hello);  // 启动线程
    t.join();                  // 等待线程结束
    return 0;
}

示例:使用lambda表达式

std::thread t([](){
    std::cout << "Lambda thread running." << std::endl;
});
t.join();

传递参数给线程函数

可以在创建线程时向线程函数传递参数,注意默认是按值传递。若需引用,必须使用std::ref包装。

void print_number(int& n) {
    n *= 2;
    std::cout << "Thread: " << n << std::endl;
}

int main() {
    int num = 42;
    std::thread t(print_number, std::ref(num)); // 必须用std::ref才能传引用
    t.join();
    std::cout << "Main: " << num << std::endl; // 输出84
    return 0;
}

线程的等待与分离

每个std::thread对象在销毁前必须明确处理其关联的执行线程,否则程序会终止(调用std::terminate)。

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

FlowIn
FlowIn

AI 时代下的内容共创平台,借助 FlowIn AI 撰写与改写内容十分便利。

下载
  • join():主线程等待子线程执行完毕。调用后,线程对象不再关联任何执行线程。
  • detach():将线程设置为后台运行,不再与std::thread对象关联。之后无法再join

std::thread t([]{
    for(int i = 0; i < 5; ++i)
        std::cout << i << " ";
});

// t.detach();  // 分离线程,独立运行
t.join();        // 等待线程完成

建议优先使用join(),除非确实需要后台异步执行且不关心结果。

管理多个线程

可以使用std::vector<:thread>来管理多个线程。

#include 

std::vector threads;

// 创建10个线程
for (int i = 0; i < 10; ++i) {
    threads.emplace_back([i](){
        std::cout << "Thread " << i << " running.\n";
    });
}

// 等待所有线程完成
for (auto& t : threads) {
    t.join();
}

基本上就这些。只要记得每个线程都要joindetach,传引用加std::ref,避免数据竞争,就能安全使用std::thread。不复杂但容易忽略细节。

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

189

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

40

2026.01.05

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

476

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

142

2025.12.24

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

142

2025.12.24

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

58

2025.12.01

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

106

2024.02.23

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

53

2026.01.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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