news 2026/2/28 5:12:28

linux之线程池

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux之线程池

1. 简介

线程池是一种用于管理和重用多个线程的设计模式。它通过维护一个线程池(线程的集合),可以有效地处理并发任务而无需每次都创建和销毁线程。这种方法可以减少线程创建和销毁的开销,提高性能和资源利用率。提高响应速度,任务来了直接交给空闲线程执行,无需等待线程创建。

2.Glib的工作流程

线程池创建:首先创建一个线程池,指定任务函数和其他参数。线程池会创建一定数量的线程,这些线程进入等待状态,准备执行任务,或在提交任务后才创建线程(取决于配置)。线程池中的所有线程执行的都是同一个任务函数。

任务队列:线程池维护一个任务队列。当我们向线程池提交任务时,任务会被放入这个队列中实际上,放入任务队列的是我们在提交任务时传递的任务数据。

线程执行任务:线程池中的线程从任务队列中取出任务数据,然后调用任务函数,执行任务。执行完成后,线程不会退出,而是继续从任务队列中取下一个任务执行。如果没有待执行的任务,线程通常在等待一段时间后被回收(取决于具体的配置)。

3. 相关函数

3.1 GFunc

// 此处的 data 是在启动任务时,传递给每个任务的,而 user_data 是在创建线程池时传入的共享数据,对于每个任务都是一样的 typedef void (*GFunc)(gpointer data, gpointer user_data);

3.2 g_thread_pool_new

/** * @brief 创建新的线程池 * * @param func 池中线程执行的函数 * @param user_data 传递给 func 的数据,可以为 NULL,这里的 user_data 最终会被存储在 GThreadPool 结构体的 user_data 属性中 * @param max_threads 线程池容量,即当前线程池中可以同时运行的线程数。-1 表示没有限制 * @param exclusive 独占标记位。决定当前的线程池独占所有的线程 还是与其它线程池共享这些线程。取值可以是 TRUE 或 FALSE * TRUE:立即启动数量为 max_threads 的线程,且启动的线程只能被当前线程池使用 * FALSE:只有在需要时,即需要执行任务时才创建线程,且线程可以被多个非独享资源的线程池共用 * @param error 用于报告错误信息,可以是 NULL,表示忽略错误 * @return GThreadPool* 线程池实例指针。无论是否发生错误,都会返回有效的线程池 */ GThreadPool *g_thread_pool_new( GFunc func, gpointer user_data, gint max_threads, gboolean exclusive, GError **error);

3.3 g_thread_pool_push

/** * @brief 向 pool 指向的线程池实例添加数据,这一行为实际上会向任务队列添加新的任务。当存在可用线程时任务立即执行,否则任务数据会一直待在队列中,直至腾出可用线程执行任务 * * @param pool 指向线程池实例的指针 * @param data 传递给每个任务的独享数据 * @param error 错误信息 * @return gboolean 成功返回 TRUE,失败返回 FALSE */ gboolean g_thread_pool_push( GThreadPool *pool, gpointer data, GError **error);

3.4 g_thread_pool_free

/** * @brief 释放为 pool 指向的线程池分配的所有资源 * * @param pool 线程池指针 * @param immediate 是否立即释放线程池 * TRUE:立即释放所有资源,未处理的数据不被处理 * FALSE:在最后一个任务执行完毕之前,线程池不会被释放 * 需要注意的是:执行任务时,线程池的任何一个线程都不会被打断。无论这个参数是何取值,都可以保证至少线程池释放前正在运行的线程可以完成它们的任务。 * @param wait_ 当前函数是否阻塞等待 所有任务完成 * TRUE:所有需要处理的任务执行完毕当前函数才会返回 * FALSE:当前函数立即返回 */ void g_thread_pool_free ( GThreadPool* pool, gboolean immediate, gboolean wait_ );

3.5 例子

#include <glib.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> void task(gpointer data,gpointer user_data){ int tmp = *((int *)data);//每个任务独享的数据。 free(data); printf("任务%d开始执行\n",tmp); sleep(tmp); printf("任务%d执行结束\n",tmp); } int main(int argc, char const *argv[]) { //创建线程池 GThreadPool * gtp = g_thread_pool_new(task,NULL,5,TRUE,NULL); //提交任务10个 for (size_t i = 0; i < 10; i++) { int * tmp = malloc(sizeof(int)); *tmp = i + 1; g_thread_pool_push(gtp,tmp,NULL); } //释放线程池 g_thread_pool_free(gtp,FALSE,TRUE); printf("所有任务都执行完成了\n"); return 0; }

结果,如图:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 23:03:17

琼海美食必看2026年海鲜大咖TOP推荐排行榜

琼海是一座充满美食魅力的城市&#xff0c;尤其以其海鲜大餐而闻名。无论是琼海姜辣鲍鱼烧排骨、琼海清蒸海鲜&#xff0c;还是琼海川湘口味海鲜&#xff0c;都能让你大快朵颐。推荐的餐厅如琼海嘉积锦锈湘江红太阳&#xff0c;以其出色的菜品和优质服务受到高度评价。此外&…

作者头像 李华
网站建设 2026/2/25 6:29:18

数眼智能大模型API实战:从接入到落地的全流程指南

一、实战前置&#xff1a;数眼智能 API 核心认知​ 在动手开发前&#xff0c;需明确数眼智能 API 的核心定位与技术优势&#xff0c;避免开发走弯路&#xff1a;​ 核心价值&#xff1a;作为大模型的「数据预处理枢纽」&#xff0c;解决实时数据获取、中文网页精准解析、合规…

作者头像 李华
网站建设 2026/2/27 15:42:48

同样是技术岗,为啥程序员怕35岁危机,网安却越老越值钱?

同样是技术岗&#xff0c;为啥程序员怕35岁危机&#xff0c;网安却越老越值钱&#xff1f; 你有没有发现&#xff0c;身边做程序员的朋友&#xff0c;一到 30 岁就开始焦虑 “35 岁后怎么办”&#xff0c;但做网安的前辈&#xff0c;反而越往后越吃香&#xff0c;薪资和话语权…

作者头像 李华
网站建设 2026/2/26 23:18:10

2026最新!9个一键生成论文工具测评:继续教育毕业论文写作全攻略

在2026年的学术写作环境中&#xff0c;随着AI技术的不断进步&#xff0c;越来越多的工具开始被应用于论文写作领域。对于继续教育学员而言&#xff0c;如何高效完成毕业论文的撰写&#xff0c;成为了一个亟需解决的问题。本文基于真实用户使用数据与实测体验&#xff0c;围绕功…

作者头像 李华
网站建设 2026/2/25 7:25:18

AGV智能搬运机器人概述

AGV智能搬运机器人概述AGV&#xff08;Automated Guided Vehicle&#xff09;智能搬运机器人是一种通过自动导航技术实现物料运输的无人化设备&#xff0c;广泛应用于制造业、仓储物流、医疗等领域。其核心功能包括自主路径规划、避障、货物搬运及系统协同作业。核心技术导航技…

作者头像 李华