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

Linux应用层开发--线程池介绍

Glib 线程池

1. 线程池简介

线程池是一种管理和重用多个线程的设计模式:

  • 避免频繁创建/销毁线程的开销。
  • 提高性能与资源利用率。
  • 任务提交后,由线程池内的线程自动执行,任务执行完线程不会退出,而是继续等待下一个任务。

2. Glib 库简介

  • Glib 是 GNOME 项目的基础库,提供数据结构、工具函数、线程支持等功能。
  • 官网文档:https://docs.gtk.org/glib/
  • 安装开发包:
sudo apt-get update
sudo apt-get install libglib2.0-dev

3. Glib 线程池工作流程

  1. 创建线程池

    • 指定任务函数 func(所有任务都调用它)。

    • 设置线程池大小、是否独占线程。

  2. 任务入队

    • 通过 g_thread_pool_push 将任务数据放入任务队列。
  3. 执行任务

    • 线程池线程取出任务数据 → 调用 func → 执行完成后继续等待下一个任务。
  4. 释放线程池

    • 等任务全部完成或立即销毁(可配置)。

4. 常用数据类型(编程时会遇到)

  • GFunc:任务函数类型
typedef void (*GFunc)(gpointer data, gpointer user_data);
// data: 每个任务单独的数据
// user_data: 创建线程池时传入的共享数据
  • gpointervoid* 类型指针

  • gintint 类型

  • gboolean:布尔值(TRUE=1, FALSE=0)

  • GError:错误信息结构体(包含错误域、错误码、错误描述)

  • GThreadPool:线程池结构体(包含任务函数、共享数据、是否独占线程等)


5. 常用函数(写代码时直接用)

1)创建线程池

GThreadPool* g_thread_pool_new(GFunc func,          // 任务函数gpointer user_data,  // 共享数据(可为NULL)gint max_threads,    // 最大线程数(-1为无限制)gboolean exclusive,  // TRUE 独占线程, FALSE 共享线程GError **error       // 错误信息(可为NULL)
);

2)添加任务

gboolean g_thread_pool_push(GThreadPool *pool,   // 线程池实例gpointer data,       // 每个任务独有的数据GError **error       // 错误信息(可为NULL)
);

3)释放线程池

void g_thread_pool_free(GThreadPool *pool,gboolean immediate,  // TRUE 立即销毁,不执行剩余任务gboolean wait_       // TRUE 等所有任务执行完才返回
);

6. 编程步骤(写代码条理)

① 编写任务函数

void task_func(gpointer data, gpointer user_data) {int task_num = *(int*)data; // 转换任务数据free(data);                 // 释放任务数据内存printf("Executing task %d...\n", task_num);sleep(1); // 模拟任务耗时printf("Task %d completed\n", task_num);
}

② 创建线程池

GThreadPool *pool = g_thread_pool_new(task_func,  // 任务函数NULL,       // 共享数据(此处无)5,          // 最大线程数TRUE,       // 独占线程NULL        // 忽略错误
);

③ 提交任务

for (int i = 0; i < 10; i++) {int *num = malloc(sizeof(int));*num = i + 1;g_thread_pool_push(pool, num, NULL);
}

④ 等待任务完成并释放资源

g_thread_pool_free(pool, FALSE, TRUE);
printf("All tasks completed\n");

7. 代码编写流程图

   ┌─────────────────────┐│ ① 编写任务函数       ││---------------------││ void task_func(...) ││   - 解析任务数据    ││   - 执行任务逻辑    ││   - 释放内存        │└─────────┬───────────┘│▼┌─────────────────────┐│ ② 创建线程池         ││---------------------││ g_thread_pool_new() ││   - 任务函数指针    ││   - 共享数据(NULL) ││   - 最大线程数     ││   - 独占/共享模式  │└─────────┬───────────┘│▼┌─────────────────────┐│ ③ 提交任务           ││---------------------││ 循环 malloc 数据    ││ g_thread_pool_push()││   - 每个任务独立数据││   - 加入任务队列    │└─────────┬───────────┘│▼┌─────────────────────┐│ ④ 等待并释放资源     ││---------------------││ g_thread_pool_free()││   - immediate=FALSE ││   - wait_=TRUE      ││ 等所有任务完成后返回 │└─────────────────────┘

8. pkg-config 作用

  • 获取编译和链接所需的参数,避免手动写路径和库名:
pkg-config --cflags glib-2.0   # 输出头文件路径
pkg-config --libs glib-2.0     # 输出链接库参数
  • 合并使用:
pkg-config --cflags --libs glib-2.0

等价于编译时手动加:

-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0
http://www.dtcms.com/a/342407.html

相关文章:

  • 【网络运维】Shell:变量数值计算
  • redis-缓存-双写一致性
  • 【Django:基础知识】
  • 掌控不平等的力量:深入解析帕雷托分布与二八法则的数学内核
  • python测试开发django-1.开始hello world!
  • 《零基础入门AI:深度学习之NLP基础学习》
  • 在Python中, list相减 要从一个列表(valid_points)中排除另一个列表(yuanjian_jiaodian)的所有元素
  • Linux CentOS 安装 .net core 3.1
  • 银河麒麟V10系统离线安装zabbix-agent教程
  • 18维度解密·架构魔方:一览无遗的平衡艺术
  • nginx-重定向-正则表达式-路由匹配优先级
  • Qt截图工具项目开发教程 - 从零开始构建系统截图工具
  • 【ARM】Keil MDK如何指定单文件的优化等级
  • 牛津大学xDeepMind 自然语言处理(5)
  • 基于 Kubernetes 的 WordPress 网站部署(使用 ConfigMap)
  • Spring两个核心IoCDI(一)
  • javaweb开发笔记—— 前端工程化
  • 当安全遇上资源瓶颈:轻量级加密为何成为 IoT 时代的刚需?
  • 基于 FPGA 的电磁超声脉冲压缩检测系统
  • 家里Windows,公司Linux?通过cpolar,WSL开发环境无缝切换
  • Python数据可视化利器:Matplotlib从入门到实战全解析
  • 今天我们继续学习计算机网络技术,Cisco软件,三层交换机以及RIP动态协议
  • 从零开始:JDK 在 Windows、macOS 和 Linux 上的下载、安装与环境变量配置
  • DeepSeek R2难产:近期 DeepSeek-V3.1 发布,迈向 Agent 时代的第一步
  • 《杠杆》电视剧分析学习
  • 【python与生活】如何从视频中提取关键帧?
  • JAVA-15 (2025.08.20学习记录)
  • 数据库面试常见问题
  • 【OpenGL】LearnOpenGL学习笔记13 - 深度测试、模板测试
  • 05 ODS层(Operation Data Store)