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

线程池的概念

  • 概念:
    通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合
  • 必要性:
    我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间,当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。
  • 线程池的基本结构:
    1 任务队列,存储需要处理的任务,由工作线程来处理这些任务
    2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号,每当任务来的时候,都会被分配到一个工作线程
    Linux中线程池及gdb调试多线程_第1张图片
  • 线程池的实现
    • 创建线程池的基本结构:
      任务队列链表
      typedef struct Task;
      线程池结构体
      typedef struct ThreadPool;
    • 代码实现:
      Linux中线程池及gdb调试多线程_第2张图片
    • 线程池的初始化:
      pool_init()
      {
      创建一个线程池结构
      实现任务队列互斥锁和条件变量的初始化
      创建n个工作线程
      }
    • 代码实现:
      Linux中线程池及gdb调试多线程_第3张图片
    • 线程池添加任务
      pool_add_task
      {
      判断是否有空闲的工作线程
      给任务队列添加一个节点
      给工作线程发送信号newtask
      }
    • 代码实现:
      Linux中线程池及gdb调试多线程_第4张图片
    • 实现工作线程
      workThread
      {
      while(1){
      等待newtask任务信号
      从任务队列中删除节点
      执行任务
      }
      }
    • 代码实现:
      Linux中线程池及gdb调试多线程_第5张图片
    • 程池的销毁
      pool_destory
      {
      删除任务队列链表所有节点,释放空间
      删除所有的互斥锁条件变量
      删除线程池,释放空间
      }
    • 代码如下:
      Linux中线程池及gdb调试多线程_第6张图片
    • main函数如下:
      Linux中线程池及gdb调试多线程_第7张图片
      编译错误:
      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调试多线程_第8张图片
  • 然后进行调试
    Linux中线程池及gdb调试多线程_第9张图片
  • 如何让线程单独调试运行如下:
    Linux中线程池及gdb调试多线程_第10张图片
  • 指定线程断点必须确保有线程运行在,因此需要先设置公共断点

你可能感兴趣的:(linux,运维,服务器)