当前位置: 首页 > news >正文

c++,linux,多线程编程详细介绍

目录

    • 一、基础概念
    • 二、POSIX线程(pthread)
    • 三、C++11标准库<thread>
    • 四、同步机制详解
    • 五、异步编程模型
    • 六、线程池实现
    • 七、代码示例

在Linux环境下使用C++进行多线程编程,可利用POSIX线程(pthread)或C++11标准库。以下从基础概念、同步机制、异步编程模型、线程池等方面进行详细介绍:

一、基础概念

线程是进程中的执行单元,共享进程的地址空间和数据,但拥有独立的执行栈和寄存器状态。多线程编程可提高程序响应性、充分利用多核资源,但需注意线程安全和资源竞争问题。

二、POSIX线程(pthread)

  • 线程创建:使用pthread_create函数创建线程,需指定线程函数、参数和属性。
  • 线程同步:
    • 互斥锁:使用pthread_mutex_t保护共享资源,避免数据竞争。
    • 条件变量:使用pthread_cond_t实现线程间的等待和通知机制。
  • 线程退出与等待:线程可通过pthread_exit退出,主线程使用pthread_join等待子线程结束。

三、C++11标准库

  • 线程创建:使用std::thread构造函数直接创建线程,支持函数指针、Lambda表达式和类成员函数。
  • 线程管理:
    • join():等待线程结束。
    • detach():分离线程,使其在后台独立运行。
  • 同步机制:
    • 互斥锁:使用std::mutex保护共享资源。
    • 条件变量:使用std::condition_variable实现线程间的同步。
    • 原子操作:使用std::atomic确保对变量的操作是线程安全的。

四、同步机制详解

  • 互斥锁:确保同一时间只有一个线程访问共享资源。
  • 条件变量:用于线程间的通信,允许线程等待某个条件成立。
  • 读写锁:允许多个线程同时读取共享资源,但在写入时阻止其他线程访问。
  • 屏障:确保多个线程在某个点上同步,所有线程都到达屏障点后才能继续执行。

五、异步编程模型

  • 回调函数:将函数作为参数传递给异步操作,操作完成后调用该函数处理结果。
  • 异步函数:使用std::async创建异步任务,返回std::future对象用于获取结果。
  • 线程池:管理线程的创建和销毁,避免频繁创建和销毁线程的开销。

六、线程池实现

线程池通过预创建一组线程,并将任务提交到任务队列中,由空闲线程执行任务。线程池可有效管理线程资源,提高程序性能。

七、代码示例

使用和互斥锁:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;
int shared_data = 0;void thread_func() {std::unique_lock<std::mutex> lock(mtx);shared_data++;
}int main() {std::thread t1(thread_func);std::thread t2(thread_func);t1.join();t2.join();std::cout << "Shared data: " << shared_data << std::endl;return 0;
}

使用条件变量:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void producer() {std::unique_lock<std::mutex> lock(mtx);ready = true;cv.notify_one();
}void consumer() {std::unique_lock<std::mutex> lock(mtx);while (!ready) {cv.wait(lock);}std::cout << "Data is ready." << std::endl;
}int main() {std::thread t1(producer);std::thread t2(consumer);t1.join();t2.join();return 0;
}
http://www.dtcms.com/a/195477.html

相关文章:

  • 2025 Adobe Acrobat DC安装教程
  • 天能股份SAP系统整合实战:如何用8个月实现零业务中断的集团化管理升级
  • Python模块化编程进阶指南:从基础到工程化实践
  • 7 个正则化算法完整总结
  • Executors类详解
  • 使用 ESP32 驱动 ±12V 压电无源蜂鸣器(NPN 三极管 + PWM 控制驱动电路)
  • arxiv等开源外文书数据的获取方式
  • 安全生产调度管理系统的核心功能模块
  • Multimodal models —— CLIP,LLava,QWen
  • 信息收集工具
  • 【问题排查】easyexcel日志打印Empty row!
  • RTK哪个品牌好?2025年RTK主流品牌深度解析
  • 跳转传参的使用
  • go封装将所有数字类型转浮点型,可设置保留几位小数
  • STM32F407VET6的HAL库使用CRC校验的思路
  • YOLOv2目标检测算法:速度与精度的平衡之道
  • 能碳管理系统:助力企业实现“双碳“目标
  • 管理工具导入CSV文件,中文数据乱码的解决办法。(APP)
  • 项目思维vs产品思维
  • 交换机典型案例
  • P21-RNN-心脏病预测
  • RV1106G3的fastboot调试
  • UAI 2025重磅揭晓:录取数据公布(附往届数据)
  • 校园一卡通安全策略研究调研报告
  • 双流芯谷产业园:元宇宙枢纽的区位密码
  • AI日报 - 2024年5月16日
  • 问答数字人解决方案​
  • 【2025年软考中级】第一章1.5 输入输出技术(外设)
  • 科技型中小企业基本条件及与高新技术企业的区别
  • 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家