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

2024-02-01 01:20

本文主要是介绍Linux中线程池及gdb调试多线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线程池的概念

  • 概念:
    通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合
  • 必要性:
    我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设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:其他线程会暂停。可以单独调试一个线程
  • 写一个简单的例子:
    在这里插入图片描述
  • 然后进行调试
    在这里插入图片描述
  • 如何让线程单独调试运行如下:
    在这里插入图片描述
  • 指定线程断点必须确保有线程运行在,因此需要先设置公共断点

这篇关于Linux中线程池及gdb调试多线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665644

相关文章

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st