Linux中线程池及gdb调试多线程

news/2025/2/6 0:49:09/

线程池的概念

  • 概念:
    通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合
  • 必要性:
    我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间,当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。
  • 线程池的基本结构:
    1 任务队列,存储需要处理的任务,由工作线程来处理这些任务
    2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号,每当任务来的时候,都会被分配到一个工作线程
    在这里插入图片描述
  • 线程池的实现
    • 创建线程池的基本结构:
      任务队列链表
      typedef struct Task;
      线程池结构体
      typedef struct ThreadPool;
    • 代码实现:
      在这里插入图片描述
    • 线程池的初始化:
      pool_init()
      {
      创建一个线程池结构
      实现任务队列互斥锁和条件变量的初始化
      创建n个工作线程
      }
    • 代码实现:
      在这里插入图片描述
    • 线程池添加任务
      pool_add_task
      {
      判断是否有空闲的工作线程
      给任务队列添加一个节点
      给工作线程发送信号newtask
      }
    • 代码实现:
      在这里插入图片描述
    • 实现工作线程
      workThread
      {
      while(1){
      等待newtask任务信号
      从任务队列中删除节点
      执行任务
      }
      }
    • 代码实现:
      在这里插入图片描述
    • 程池的销毁
      pool_destory
      {
      删除任务队列链表所有节点,释放空间
      删除所有的互斥锁条件变量
      删除线程池,释放空间
      }
    • 代码如下:
      在这里插入图片描述
    • main函数如下:
      在这里插入图片描述
      编译错误:
      error: ‘ThreadPool {aka struct ThreadPool}’ has no member named ‘head’
      意义:ThreadPool 结构体没有head这个成员。
      解决:检查是否拼写错误。
      error: too few arguments to function ‘pthread_mutex_init’
      意思:pthread_mutex_init这个函数参数少了
      解决:检查函数的参数,添加对应的参数

线程的GDB调试

  • 显示线程
    info thread
    切换线程
    thread id
    GDB为特定线程设置断点
    break location thread id
    GDB设置线程锁,
    set scheduler-locking on/off
    on:其他线程会暂停。可以单独调试一个线程
  • 写一个简单的例子:
    在这里插入图片描述
  • 然后进行调试
    在这里插入图片描述
  • 如何让线程单独调试运行如下:
    在这里插入图片描述
  • 指定线程断点必须确保有线程运行在,因此需要先设置公共断点

http://www.ppmy.cn/news/1338234.html

相关文章

【思科】 GRE VPN 的实验配置

【思科】GRE VPN 的实验配置 前言报文格式 实验需求配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN :(Virtual Private Network),即“虚拟专…

DevSecOps 参考模型介绍

目录 一、参考模型概述 1.1 概述 二、参考模型分类 2.1 DevOps 组织型模型 2.1.1 DevOps 关键特性 2.1.1.1 模型特性图 2.1.1.2 特性讲解 2.1.1.2.1 自动化 2.1.1.2.2 多边协作 2.1.1.2.3 持续集成 2.1.1.2.4 配置管理 2.1.2 DevOps 生命周期 2.1.2.1 研发过程划分…

一次Rust重写基础软件的实践(三)

前言 受到2022年“谷歌使用Rust重写Android系统且所有Rust代码的内存安全漏洞为零” [1] 的启发,最近笔者怀着浓厚的兴趣也顺应Rust 的潮流,尝试着将一款C语言开发的基础软件转化为 Rust 语言。本文的主要目的是通过记录此次转化过程中遇到的比较常见且有…

TOP100 矩阵

1.73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示&#xff1a; m matrix.lengthn matrix[0].length1 < m, n < 200-2^31 < matrix[i][j] < 2^31 - 1 思路&#xf…

山体滑坡在线安全监测预警系统(解决方案)

在近年来&#xff0c;随着全球气候变化的影响&#xff0c;山体滑坡等自然灾害频发&#xff0c;给人们的生命财产安全带来了严重威胁。为了有效预防和减少山体滑坡带来的危害&#xff0c;许多地方开始在山上安装山体滑坡在线安全监测预警系统&#xff08;解决方案&#xff09;。…

【极数系列】Flink集成DataSource读取Socket请求数据(09)

文章目录 01 引言02 简介概述03 基于socket套接字读取数据3.1 从套接字读取。元素可以由分隔符分隔。3.2 windows安装netcat工具&#xff08;1&#xff09;下载netcat工具&#xff08;2&#xff09;安装部署&#xff08;3&#xff09;启动socket端口监听 04 源码实战demo4.1 po…

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]

阅读导航 引言一、设计模式概念&#xff08;了解&#xff09;二、单例模式1. 饿汉模式&#xff08;1&#xff09;概念&#xff08;2&#xff09;模拟实现&#xff08;3&#xff09;优缺点&#xff08;4&#xff09;适用场景 2. 懒汉模式&#xff08;1&#xff09;概念&#xff…

支付宝支付功能解析,从零到掌握,轻松享受便捷支付

目录 一、支付宝支付功能简介 1.1 支付宝支付的概念 1.2 支付宝支付的优势 1.3 支付宝支付的适用场景 二、支付宝支付的准备工作 三、支付宝支付的接入流程 四、支付宝支付的安全性 5.1 支付宝支付的安全机制 5.2 防范支付风险的措施 5.3 支付宝支付的安全技术保障 …