0

0

c++怎么实现多线程_c++多线程实现方法

下次还敢

下次还敢

发布时间:2025-10-02 08:29:02

|

1070人浏览过

|

来源于php中文网

原创

使用std::thread实现多线程是C++11起的标准方法,支持函数、lambda和函数对象作为线程目标,无需依赖平台API。

c++怎么实现多线程_c++多线程实现方法

在C++中实现多线程,最常用的方式是使用标准库中的 std::thread。从 C++11 开始,C++ 提供了对多线程的原生支持,无需依赖第三方库或平台特定的API(如 Windows 的 CreateThread 或 POSIX 的 pthread)。以下是几种常见的C++多线程实现方法。

1. 使用 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;
}

注意:必须调用 join()detach(),否则程序在主线程结束时会调用 std::terminate()。

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

2. 传递参数给线程函数

可以向线程函数传递参数,但要注意默认是按值传递。如果需要引用,应使用 std::ref

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

int main() {
    int num = 5;
    std::thread t(print_number, std::ref(num));  // 使用 std::ref 传递引用
    t.join();
    std::cout << "Main: num = " + num << std::endl;  // 输出 15
    return 0;
}

3. 使用 Lambda 表达式创建线程

Lambda 可以捕获局部变量,适合在局部作用域中启动线程。

BJXSHOP网上开店专家
BJXSHOP网上开店专家

BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛

下载
int main() {
    int id = 1;
    std::thread t([id]() {
        std::cout << "Lambda thread with id: " << id << std::endl;
    });
    t.join();
    return 0;
}

4. 线程同步:互斥锁(std::mutex)

多个线程访问共享资源时,需要加锁防止数据竞争。

#include 

std::mutex mtx;
int shared_data = 0;

void safe_increment() {
    for (int i = 0; i < 100000; ++i) {
        mtx.lock();
        ++shared_data;
        mtx.unlock();
    }
}

int main() {
    std::thread t1(safe_increment);
    std::thread t2(safe_increment);
    t1.join();
    t2.join();
    std::cout << "Final value: " << shared_data << std::endl;  // 应为 200000
    return 0;
}

更推荐使用 std::lock_guard 实现RAII自动加锁解锁:

void safe_increment() {
    for (int i = 0; i < 100000; ++i) {
        std::lock_guard lock(mtx);
        ++shared_data;
    }
}

5. 使用 std::async 和 std::future 获取返回值

适用于需要异步执行并获取结果的场景。

#include 

int compute() {
    return 42;
}

int main() {
    std::future result = std::async(compute);
    std::cout << "Result: " << result.get() << std::endl;  // 阻塞等待结果
    return 0;
}

6. 线程池(高级用法)

实际项目中常使用线程池避免频繁创建销毁线程。虽然标准库没有直接提供线程池,但可以用队列 + 多个线程 + 条件变量实现。

核心组件包括:

  • 任务队列(std::queue)
  • 线程集合(std::vector<:thread>)
  • 互斥锁和条件变量(std::mutex, std::condition_variable)
  • 停止标志

基本上就这些常见用法。C++多线程编程的关键是掌握 std::threadstd::mutexstd::lock_guardstd::asyncstd::future。合理使用这些工具,可以写出高效且安全的并发程序。

相关专题

更多
lambda表达式
lambda表达式

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

202

2023.09.15

python lambda函数
python lambda函数

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

187

2025.11.08

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

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

469

2023.08.10

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

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

106

2025.12.24

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

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

106

2025.12.24

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

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

53

2025.12.01

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

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

106

2024.02.23

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

513

2023.07.26

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

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

精品课程

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

共48课时 | 6.3万人学习

Excel 教程
Excel 教程

共162课时 | 10.1万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

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

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