首页 > 后端开发 > C++ > 正文

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

下次还敢
发布: 2025-10-02 08:29:02
原创
985人浏览过
使用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 <iostream>
#include <thread>

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 可以捕获局部变量,适合在局部作用域中启动线程。

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译
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 <mutex>

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<std::mutex> lock(mtx);
        ++shared_data;
    }
}
登录后复制

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

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

#include <future>

int compute() {
    return 42;
}

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

6. 线程池(高级用法)

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

核心组件包括:

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

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

以上就是c++++怎么实现多线程_c++多线程实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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