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.pswp.cn/pingmian/93821.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93821.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93821.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python 多进程与多线程:从原理到实践

Python 多进程与多线程&#xff1a;从原理到实践 文章目录Python 多进程与多线程&#xff1a;从原理到实践前言一、并发编程基础&#xff1a;进程与线程1.1 进程&#xff08;Process&#xff09;1.2 线程&#xff08;Thread&#xff09;1.3 进程与线程的关系二、Python 中的 &q…

electron-vite_18Less和Sass共用样式指定

项目中可以封装less公用样式和方法&#xff0c;比如自动以滚动条样式、单行省略号、多行省略号、display:none等&#xff1b;关于additionalData的配置生效,请在main.js中引入一个别的样式或vue组件中使用“<style lang“scss”><style>”找到electron.vite.config…

Python面试题及详细答案150道(71-80) -- 文件操作篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

python新工具-uv包管理工具

uv 是一个由 Astral (Ruff 的创建者) 开发的极速 Python 包和项目管理器&#xff0c;用 Rust 编写。它旨在作为传统 Python 包管理工具&#xff08;如 pip、pip-tools、pipx、poetry、pyenv、twine 和 virtualenv 等&#xff09;的替代品&#xff0c;通过其高性能和多功能集成&…

有关spring-ai的defaultSystem与systemMessage优先级

今天在写项目的时候想用nacos随时修改system的prompt&#xff0c;突然发现defaultSystem的优先级比systemMessage高很多&#xff0c;废话我就不说了&#xff0c;看图吧。你觉得证据不够&#xff1f;那这样呢&#xff1f;

#运维 | 前端 # Linux http.server 实践:隐藏长文件名,简短路径 (http://IP:port/别名 ) 访问

如何运行页面为 http://ip:port/名称 1. 准备文件目录 假设文件原始位置&#xff1a; /home/ubuntu/projects/yinran/ckd.html将它移动到子目录并改名为 index.html&#xff1a; mkdir -p /home/ubuntu/projects/yinran/ckd mv /home/ubuntu/projects/yinran/ckd.html \/home/u…

任务管理器不刷新

记录一个小问题&#xff1a; 进入任务管理器之后发现页面不会刷新&#xff0c;性能界面也是一致。解决办法&#xff1a;查看–>更新速度–>正常

2025-08-21 Python进阶9——__main__与lambda

文章目录1 \_\_main\_\_1.1 name 变量1.1.1 当模块作为主程序直接运行时1.1.2 当模块被其他模块导入时1.2 \_\_main\_\_ 的含义1.3 if \_\_name\_\_ \_\_main\_\_1.5 小结2 lambda表达式2.1 基本概念2.2 lambda 函数语法2.3 使用示例2.4 与高阶函数结合使用2.4.1 与 map () 结…

Java:将视频上传到腾讯云并通过腾讯云点播播放

功能需求:传入一个videoFile也就是视频字节流,返回腾讯云点播的视频保存url需要在腾讯云中寻找的配置信息:导入的依赖:<!--腾讯云点播--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId&…

Unity3D物理游戏网络同步指南

前言 Unity3D 物理游戏的网络同步是一个复杂但非常核心的话题。要实现一个流畅、公平且可扩展的多人物理游戏&#xff0c;需要深入的理解和精心的设计。 下面我将为你全面解析 Unity3D 物理游戏的网络同步&#xff0c;包括核心概念、主流方案、实现细节以及最佳实践。 对惹&…

Amazon Redshift 访问配置完整指南

概述 Amazon Redshift 是 AWS 提供的云端数据仓库服务,支持多种访问方式。本文将详细介绍如何配置 IAM 权限、使用 AWS 控制台 Query Editor v2,以及通过 SQL Workbench/J 等第三方工具连接 Redshift 集群。 目录 环境准备 IAM 权限配置 Redshift 用户管理 AWS 控制台访问 …

electron-vite_19配置环境变量

前端配罟环境变量主要通过项目根目录下的.env系列文件实现&#xff0c;不同框架(如Vue、React)或构建工具(如Vite、Webpack)的具体操作略有差异&#xff0c;但核心逻辑均为通过环境变量文件区分开发、测试、生产等环境。方案1: 直接在根目录新建.env文件 1.在根目录新建 .env.d…

【python】arange用法

1. NumPy 里的 np.arangeimport numpy as np# 语法 np.arange([start, ]stop, [step, ], dtypeNone)参数说明&#xff1a;start&#xff1a;起始值&#xff08;默认 0&#xff09;stop&#xff1a;终止值&#xff08;不包含这个值&#xff09;step&#xff1a;步长&#xff08;…

力扣1005:k次取反后最大化的数组和

力扣1005:k次取反后最大化的数组和题目思路代码题目 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&…

国产数据库管理工具 CloudDM 2.7.1.0 发布,OceanBase 等数据源支持复杂 SQL 脱敏数据

CloudDM 是 ClouGence 公司推出的面向团队使用的数据库管理工具&#xff0c;支持云上、云下、多云等多种环境&#xff0c;并且提供多达 23 种数据源的支持。CloudDM 还支持数据库 DevOps CI/CD 功能&#xff0c;将用户产品发布流程中数据库发布和程序发布无缝串联起来。 更新亮…

AI大模型实战:用自然语言处理技术高效处理日常琐事

引言在数字化时代&#xff0c;我们每天都会面对大量的琐碎事务&#xff1a;整理会议记录、处理名单数据、撰写学习笔记等等。这些工作不仅耗时&#xff0c;而且容易出错。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;特别是大语言模型&#xff08;LLM&#xff09;的…

【spring security】为什么要使用userdetailservice

Spring Security UserDetailsService 深度解析&#xff1a;从401到认证成功的完整实现 &#x1f4cb; 目录 问题背景Spring Security认证架构UserDetailsService的作用完整实现过程常见问题与解决方案最佳实践 &#x1f3af; 问题背景 在开发B2B采购平台时&#xff0c;我们…

机器学习中的数据处理技巧

一、Pandas处理丢失数据&#xff08;一&#xff09;判断缺失值​​isnull()函数​​&#xff1a;用于判断数据框&#xff08;DataFrame&#xff09;中各个单元格是否为空&#xff0c;可帮助我们识别出存在缺失数据的单元格位置。&#xff08;二&#xff09;处理缺失值的方法​​…

田野科技“一张皮”,“AI+虚拟仿真”推动考古教学创新发展

文运同国运相牵&#xff0c;文脉同国脉相连。考古不仅关系到我们对古代文化的认知、发掘、保护、利用&#xff0c;关系到考古学学科体系、学术体系、话语体系的建设&#xff0c;更是关系到我国考古学的国际影响力&#xff0c;对增强世界不同地区古代文明的比较研究有着十分重要…

为什么我的UI界面会突然卡顿,失去响应

有操作都应是“非阻塞”的&#xff0c;以确保能随时响应用户的输入。导致主线程阻塞的常见“元凶”主要涵盖五个方面&#xff1a;主线程被“长时间”的同步计算所“阻塞”、单次渲染的界面节点过多或过于复杂、内存中存在“未释放”的巨大对象或“内存泄漏”、响应了“高频率”…