C++中实现多线程编程

作者:Alex艾力的IT数字空间日期:2025/11/10

一、基于POSIX线程库(pthreads)

适用场景:Linux/Unix系统、需要底层线程控制或兼容旧代码。

核心步骤

  1. 包含头文件#include <pthread.h>
  2. 定义线程函数:返回类型为void*,参数为void*指针。
  3. 创建线程:使用pthread_create函数。
  4. 等待线程结束:使用pthread_join回收资源。

示例代码

1#include <iostream>
2#include <pthread.h>
3
4void* threadFunction(void* arg) {
5    int id = *((int*)arg);
6    std::cout << "Thread " << id << " is running.\n";
7    return nullptr;
8}
9
10int main() {
11    const int numThreads = 5;
12    pthread_t threads[numThreads];
13    int threadIds[numThreads];
14
15    for (int i = 0; i < numThreads; ++i) {
16        threadIds[i] = i;
17        if (pthread_create(&threads[i], nullptr, threadFunction, &threadIds[i]) != 0) {
18            std::cerr << "Failed to create thread "<< i << "\n";
19            return 1;
20        }
21    }
22
23    for (int i = 0; i < numThreads; ++i) {
24        pthread_join(threads[i], nullptr);
25    }
26
27    std::cout << "All threads finished.\n";
28    return 0;
29}

编译命令

g++ -pthread -o multithread_example multithread_example.cpp


二、基于C++11标准库(<thread>

适用场景:现代C++项目(C++11及以上)、跨平台开发。

核心优势:语法简洁,类型安全,支持RAII管理。

核心步骤

  1. 包含头文件#include <thread>
  2. 创建线程:直接实例化std::thread对象,传入可调用对象(函数、Lambda等)。
  3. 管理线程:使用join()等待线程结束或detach()分离线程。

示例代码

1#include <iostream>
2#include <thread>
3#include <vector>
4
5void threadFunction(int id) {
6    std::cout << "Thread " << id << " is running.\n";
7}
8
9int main() {
10    std::vector<std::thread> threads;
11    for (int i = 0; i < 5; ++i) {
12        threads.emplace_back(threadFunction, i);
13    }
14
15    for (auto& t : threads) {
16        if (t.joinable()) t.join();
17    }
18
19    std::cout << "All threads finished.\n";
20    return 0;
21}

编译命令

g++ -std=c++11 -o multithread_example multithread_example.cpp


三、线程同步机制

多线程访问共享资源时需避免竞态条件,常用工具包括:

  1. 互斥锁(std::mutex
1#include <mutex>  
2std::mutex mtx;  
3void safePrint(int id) {  
4    std::lock_guard<std::mutex> lock(mtx); // 自动加锁/解锁  
5    std::cout << "Thread " << id << " is accessing shared data.\n";  
6}  
  1. 条件变量(std::condition_variable
    用于线程间通信,例如生产者-消费者模型:
1#include <condition_variable>  
2std::condition_variable cv;  
3bool ready = false;  
4void worker() {  
5    std::unique_lock<std::mutex> lock(mtx);  
6    cv.wait(lock, []{ return ready; }); // 等待通知  
7    // 执行任务  
8}  
9void trigger() {  
10    {  
11        std::lock_guard<std::mutex> lock(mtx);  
12        ready = true;  
13    }  
14    cv.notify_all(); // 通知所有等待线程  
15}  

四、高级并发工具

  1. std::asyncstd::future
    异步执行任务并获取返回值,适合简化并行任务管理:
1#include <future>  
2int computeSum(int a, int b) {  
3    return a + b;  
4}  
5int main() {  
6    std::future<int> result = std::async(std::launch::async, computeSum, 3, 4);  
7    std::cout << "Sum: " << result.get() << "\n"; // 阻塞等待结果  
8    return 0;  
9}  
  1. 线程池(第三方库)
    如Boost.Thread或自定义实现,用于复用线程减少创建/销毁开销。

五、方法对比与选择建议

方法优点缺点适用场景
pthreads底层控制灵活,兼容性强语法繁琐,需手动管理资源跨平台旧项目、精细控制需求
C++11 <thread>语法简洁,RAII自动管理依赖C++11及以上标准现代C++项目、跨平台开发
std::async简化异步任务管理,自动线程调度任务调度策略由实现决定需要返回值的并行任务

六、注意事项

  1. 线程安全:共享数据必须通过互斥锁、原子操作(std::atomic)等保护。
  2. 资源泄漏:确保每个pthread_create对应pthread_join,或使用detach()
  3. 编译选项
    • pthread需添加-pthread(Linux/CentOS)或-lpthread
    • C++11需添加-std=c++11或更高版本标志。

C++中实现多线程编程》 是转载文章,点击查看原文


相关推荐


微信小程序开发案例 | 个人相册小程序(上)
志昂张呀2025/11/8

阶段案例-个人相册小程序 01、准备工作 1 导入代码包 为了节约时间,这里我们直接把完成的小程序空白模板代码包templateDemo复制一份并重命名为demo07_myAlbum, 导入开发工具等待改造。 2 启动服务器 这里我们使用本地电脑安装phpStudy v8.1套件来模拟服务器效果,本次阶段案例不需要使用MySQL数据库,因此直接启动Apache或者Nginx来模拟Web服务器即可。 以Nginx为例,启动效果如图7-8所示。 ■ 图7-8  ph


Python 的内置函数 getattr
IMPYLH2025/11/6

Python 内建函数列表 > Python 的内置函数 getattr def getattr(obj, name:str): ''' 获取属性的值 :param obj: 一个对象 :param name: 属性的名字 ''' Python 的内置函数 getattr 是一个非常有用的反射工具,主要用于动态获取对象的属性或方法。其基本语法为:getattr(object, name[, default]),其中 object 是目标对象,nam


Flash游戏破解参考
FD_20132025/11/1

编 者按:工作、学习之余,玩一会Flash小游戏,放松一下紧绷的神经,是不少朋友的最爱。不过,大部分Flash小游戏并不提供SWF文件的下载,想玩游 戏就必需打开网页,也给我们带来了不小的麻烦。当然,小小的问题难不倒我们,通过各种途径,我们依然可以获取各种被加密的SWF文件,从而无需联网,便能 在本地运行Flash小游戏。 对症下药,玩转Flash游戏下载 Flash游戏下载,关键便在于获取SWF文件的真实URL地址。由于不同类型的Flash游戏,采用的加密、运行方式各不相同,因此必需采


南京大学LLM开发基础(四)MoE, LoRA, 数的精度 + MLP层实验
nju_spy2025/10/30

https://njudeepengine.github.io/llm-course-lecture/2025/lecture8.html#1 目录 1. Mixture-of-experts (MoE) 1.1 优势 1.2 结构 1.3 训练 2. Low-rank adaptation (LoRA) 3. 数的精度 -- 混合精度 + 量化操作 Task1:DenseMLPWithLoRA 一、任务背景 二、任务要求 Task2:Sparse MLP 1.


【C++list】底层结构、迭代器核心原理与常用接口实现全解析
m0_748233642025/10/27

一、官方源码的探究 在实现list的底层前,我们先看下官方的核心成员变量,link_type node,其中link_type是list_node*,也就是说是节点的指针 在这里插入图片描述 下面我们看下其的初始化,在空初始化中,链表为空并不是把节点的指针给成空,而是给了个节点,让其的前驱指针和后继指针均指向自己,在C语言阶段的数据结构中我们便知道这个节点是哨兵位头节点 注意: 这里创捷新的节点不是new的,而是使用get_node出来的,这里是由于内存池的原因,后续再介绍


从复杂到高效:QtitanNavigation助力金融系统界面优化升级
Aevget2025/10/24

QtitanNavigation 组件模拟Microsoft Dynamics CRM-2016 / Office 365导航界面和一组控件,来改善Qt.C ++应用程序的用户体验。QtitanNavigation结合用户界面构建“Ribbon UI”和“Side Bar”的各种示例,可以更好地在您的应用程序中导航,使用户更直观地访问应用程序的某些部分。因此,它允许同时显示更多的信息,并让您高效地查看所有实体(工作区域,网格或其他项目),滚动次数更少,点击次数更少。与我们的其他解决方案一样,Qt


Rust 与 Go – 比较以及每个如何满足您的需求
std78792025/10/22

Rust 和 Go 是新的编程语言。每个都解决了以前编程语言(例如 C 和 C++)固有的问题。 如果您不确定哪一个适合您的项目,请查看这篇比较文章,我们将在其中更深入地研究 Rust 与 Go。 在比较结束时,您将清楚地了解 Rust 和 Go 提供的功能。我们将介绍它们的主要特点、优缺点、异同,并根据您的要求讨论正确的选择。 除此之外,我们还将争辩说,大多数团队可能能够同时使用这两种语言来支持他们的应用程序,并且比只坚持使用一种编程语言获得好处。 那么,为什么还要等呢?让我们


node.js上传图片接口
郏国上2025/10/21

node.js需要使用koa-multer库来实现上传图片接口。 实际上先通过koa-multer下载到本地指定目录,然后上传到阿里云(部分格式图片需要转换成网络格式图片jgp再上传)。 首先在系统启动文件引入注册路由: app.use(BodyParser({ 'formLimit':'3mb', 'jsonLimit':'3mb', 'textLimit':'3mb' })); // 注意顺序,必须body parser在前, router在后 app.use(rou


SpringBoot的学习
ʚ希希ɞ ྀ2025/10/20

学习目标: 1.掌握基于SpringBoot框架的程序开发步骤 2.熟练使用SpringBoot配置信息修改服务器配置 3.基于SpringBoot的完成SSM整合项目开发 下图创建一个Spring模块: 下图是一个SpringBoot程序最基本的架子: 如下一个SpringBoot程序就开发好了。 SpringBoot程序之所以好用是因为pom文件中的继承和一个dependency: 最后运行Application类: Spring程序和S


小杰深度学习(sixteen)——视觉-经典神经网络——MobileNetV2
jie*2025/10/19

7.MobileNetV2 1. 网络的背景 MobileNetV1 还不够轻量和高性能,为了让移动设备有更好的体验,Google 团队提出了 MobileNetV2 架构 MobileNetV2网络是由谷歌团队在2018年提出的,它相对于MobileNetV1而言,有着更高的准确率和更小的网络模型。 论文地址:https://arxiv.org/abs/1801.04381 Inverted Residuals and Linear Bottlenecks.pdf 2. 网络的

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0